Java: tipi (im)mutaibili. Metodi equals e clone
|
|
|
- Angelina Leonardi
- 9 anni fa
- Просмотров:
Транскрипт
1 Java: tipi (im)mutaibili. Metodi equals e clone Mutabilità Un tipo è mutabile (mutable) se ha dei metodi che possono modificare ilrep, altrimenti è detto immutabile (immutable). della classe! Il metodo è mutator già nella specifica Come decidere fra mutable e immutable? Perché IntSet mutable e Poly immutable? 2 1
2 Mutable meglio per oggetti che modellano entità del mondo reale: automobili, persone, ecc. che cambiano dinamicamente poco sicuro se oggetti condividono parti, ma efficiente quindi lo usiamo per IntSet perché pensiamo che dovremo spesso mettere o togliere elementi: molto più efficiente se non dobbiamo ad ogni inserzione copiare il contenuto di un IntSet in un nuovo oggetto e Richiede syncronized, lock ecc. per essere thread-safe 3 Immutable Usato sempre se oggetti possono comparire in espressioni, come ad es. oggetti espressioni non hanno side-effect spiacevoli... Es. supponiamo che Poly sia mutabile e add sia così definita: //@ ensures q!=null && (* this == \old(this) + q *); //@ signals (NullPointerException e) q == null; public Poly add(poly q) throws NullPointerException se p = 3x, che cosa vale p dopo p.add(p).add(p)? è come p+p+p? e p.add(p.add(p))? è come p+(p+p)? Da usare se oggetti devono potere condividere parti, o per non usare sync. In programmazione multithread poco efficiente se occorre spesso modificare oggetti: per cambiare un oggetto occorre farne una copia con produttori, con perdita di tempo e appesantimento del garbage collector. Tipicamente, i tipi immutabili sono dichiarati /*@ in JML (ma ciò non basta a garantire immutabilità...) 4 2
3 Come definire oggetti immutabili Definire tutti gli attributi di istanza final e private però se servono effetti coll. benevoli allora possono non essere final Se gli attributi di istanza hanno riferimenti a oggetti mutabili non esporre le parti mutabili del rep Se si vuole che anche gli oggetti delle sottoclassi restino immutabili, non consentire alle sottoclassi di fare override dei metodi basta dichiarare la classe final 5 Il metodo public Object clone() Il metodo clone() restituisce una copia del suo oggetto, nello stesso stato. clone bitwise copy) ma normalmente clone non è accessibile (protected): se si vuole che classe fornisca clone, occorre scrivere: implements Cloneable e definire un metodo clone (che ad esempio richiama il clone definito in Object), altrimenti chiamata a clone() provoca eccezione CloneNotSupportedException: public class IntSet implements Cloneable{ public Object clone() {return super.clone();} IntSet s = new IntSet(); s.insert(2); IntSet t = (IntSet) s.clone(); //clone restituisce un Object: serve cast clone() può esser definito ad hoc quando la definizione di Object non va 6 3
4 Quando ridefinire clone()? clone() (se serve usarlo) va ridefinito se la classe è mutabile. Es. IntSet s = new IntSet(); IntSet t = (IntSet) s.clone();s.insert(2); System.out.println(t.toString()); la clone() di default (in Object) copia campo per campo, cioè: t= (IntSet) s.clone(); è come t = new IntSet(); t.els =s.els; Quindi s e t hanno stesso valore per campo els di tipo ArrayList: sharing! Oggetti mutabili non possono condividere parti, pena grossi guai! Implementazione corretta per IntSet: private IntSet(ArrayList v) {els = v;} public Object clone() { return new IntSet((ArrayList) els.clone()); } si basa sul fatto che clone() di ArrayList fa copia elemento per elemento 7 Problemi con clone() di Object e tipi mutabili (shallow copy) paolo p seteta eta = 020 seteta eta = seteta eta = 020 p = () paolo.clone(); //usa bitwise clopy //modifiche a p.padre sono modifiche a paolo.padre, anche se paolo e p sono oggetti distinti! 8 4
5 Differenza con deep copy paolo p seteta eta = 020 seteta eta = seteta eta = 020 seteta eta = p = () paolo.clone(); //ora usa deep clopy 9 clone() e tipi immutabili Non è invece necessario ridefinire clone se la classe è immutabile! Se classe è immutabile, basta una sola copia dei suoi oggetti Poly p = new Poly(3,2); Poly q = p; q è copia di p, anche se sono condivisi: oggetto riferito da p (e quindi p non può essere cambiato! quindi se clone() serve per tipi immutabili (ad es. perché si richiamano metodi che si aspettano degli oggetti clonabili), basta implementare un metodo che richiama quello predefinito in Object o addirittura che fa copia del reference 10 5
6 Metodo equals della classe Object -tipi della classe Object, per cui è predefinite le operazioni public boolean equals (Object z) implementazione di default: confronto fra reference: due oggetti sono equals solo se sono lo stesso oggetto dei metodi della classe Object o se è meglio ri-definirli!!! Nel caso di equals occorre una certa Lo standard Java richiede che: public boolean equals(object obj) indicates whether some other object is "equal to" this one. The equals method implements an equivalence relation on non-null object references: It is reflexive: for any non-null reference value x, x.equals(x) should return true. It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true. It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true. It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified. For any non-null reference value x, x.equals(null) should return false. 11 Quale eguaglianza rappresentare in equals? equals dovrebbe implementare uguaglianza di comportamento (behavioral equivalence): due oggetti sono equals se non è possibile distinguerli usando una sequenza di invocazioni di metodi della classe su uno dei due oggetti Motivo della scelta: altrimenti sorgono problemi con collezioni di oggetti mutabili che usano ad esempio equals per cercare un oggetto (si vedrà meglio con astrazioni polimorfe) Scelta poco seguita: in SDK ad esempio il metodo per la classe List è definito così: public boolean equals(object o) compares the specified object with this list... Returns true if and only if the specified object is also a list, both lists have the same size, and all corresponding pairs of iterator in the two lists are equal.... Questa definizione non è equivalente alla precedente!! Due liste sono equals a un certo punto, ma possono diventare!equals perche un elemento! 12 6
7 equals con oggetti immutabili Due oggetti immutabili sono equals sse hanno lo stesso stato astratto Motivo: due oggetti immutabili non possono essere distinti tramite mutazioni; inoltre gli observer della classe permettono solo di distinguere gli oggetti se hanno un diverso stato astratto (altrimenti le osservazioni non danno differenza) p e q non possono essere distinti tramite mutazioni: equals deve dare true quindi equals va ridefinito se la classe è immutabile (i reference sono diversi ma oggetti sono equals). Es. con String, equals controlla uguaglianza carattere per carattere a.equals(b) dà true NB: due oggetti (immutabili) concreti diversi con lo stesso stato astratto sono equals!! 13 Es. Implementazione equals Il tipo immutabile Point2D rappresenta punti in spazio 2D class Point2D { private int x; private int y; } public boolean equals (Point2D p) { return (x==p.x && y==p.y) } public boolean equals (Object z) { if (!(z instanceof Point2D)) return false; return equals((point2d ) z); } definisce un equals che restituisce true sse due punti hanno le stesse coordinate x e y overloading) utile per maggiore efficienza: se compilatore equals su Point2D, non si deve fare instanceof + casting. 14 7
8 il metodo equals e gli oggetti mutabili Due oggetti mutabili sono equals se e solo se sono lo stesso oggetto: List<Integer> s = new ArrayList<integer>(); List<Integer> t = new ArrayList<integer>(); if (s.equals s e t non sono equals anche se hanno lo stesso stato, perché sono distinguibili attraverso mutazioni: dopo s.insert(2), s e t hanno stati diversi! quindi equals non andrebbe ridefinito se la nuova classe è mutabile (es ArrayList) perché questa è proprio la definizione data in Object. Se serve eguaglianza più debole, definire un metodo ad hoc (come similar: oggetti indistinguibili usando solo observers, cioè stesso stato astratto) ad esempio, s.similar(t) deve dare true se s e t rappresentano liste uguali Questo principio è spesso ignorato in pratica (p.es. in tutte le librerie di Java), e può causare errori con i contenitori. Ad es., ArrayList ridefinisce equals anche se ArrayList è tipo mutabile. 17 Riassunto equals e clone Metodo Tipo Mutabile Tipo Immutabile equals Accettare definizione di Object (uguaglianza dei reference) (poco usato in pratica) Ridefinirlo come uguaglianza di stato astratto clone Ridefinirlo come copia dello stato astratto, se serve che sia disponibile Richiamare definizione di Object (copia del reference), se serve che sia disponibile 18 8
Uguaglianza e copia di oggetti
Uguaglianza e copia di oggetti Sommario 1. Classi Object e Class 2. Uguaglianza superficiale e uguaglianza profonda 3. Copia superficiale e copia profonda 4. Uguaglianza e copia in classi derivate 1 La
La classe java.lang.object
La classe java.lang.object In Java: Gerarchia di ereditarietà semplice Ogni classe ha una sola super-classe Se non viene definita esplicitamente una super-classe, il compilatore usa la classe predefinita
Programmazione 2 - Marco Ronchetti. Fondamenti di Java. Fac.Scienze Università di Trento. Static
1 Fondamenti di Java Static 2 Modificatori: static Variabili e metodi associati ad una Classe anziche ad un Oggetto sono definiti static. Le variabili statiche servono come singola variabile condivisa
A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas
Classi e oggetti A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas Oggetti La programmazione orientata agli oggetti, OOP (Object-Oriented Programming),
Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)
Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I) Ing. Gianluca Caminiti Sommario ( OOP ) Programmazione Object-Oriented Incapsulamento, Ereditarietà, Polimorfismo Richiami
Fondamenti di Informatica I
Sapienza Università di Roma, Facoltà di Ingegneria Corso di Fondamenti di Informatica I Canale 1 (A-K) Anno Accademico 2009-2010 Corso di Laurea in Ingegneria Informatica Docente: Camil Demetrescu Esercitatore:
Esempio su strutture dati dinamiche: ArrayList
Esempio su strutture dati dinamiche: ArrayList Fondamenti di Informatica L-B 1 ArrayList Abbiamo detto che gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito
18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
18 - Vettori Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://pages.di.unipi.it/milazzo milazzo di.unipi.it Corso di
Programmazione Java Struttura di una classe, Costruttore, Riferimento this
Programmazione Java Struttura di una classe, Costruttore, Riferimento this [email protected] http://www.di.univaq.it/romina.eramo/tlp Roadmap > Struttura di una classe > Costruttore > Riferimento
Esempio su strutture dati dinamiche: ArrayList
Esempio su strutture dati dinamiche: ArrayList 1 ArrayList Abbiamo detto che gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito al momento della creazione
Numeri complessi. Definire un ADT Complex in grado di rappresentare un numero complesso. La classe deve essere immutabile.
Abstract Data Types Numeri complessi Definire un ADT Complex in grado di rappresentare un numero complesso. La classe deve essere immutabile. Cosa serve /*@ pure @*/ public class Complex{ //Creators //Observers
Riassunto: cos è la OOP? classi astratte, interfacce, classi interne. Scaletta. Figura con area()? Figura senza area()? Stefano Mizzaro 1.
OO in Java: classi astratte, interfacce, classi interne Stefano Mizzaro Dipartimento di matematica e informatica Università di Udine http://www.dimi.uniud.it/mizzaro [email protected] Programmazione,
ESERCIZI JAVA. Esercizi sulle Interfacce. Esercizio 1:
ESERCIZI JAVA Esercizi sulle Interfacce Esercizio 1: Java mette a disposizione un'interfaccia chiamata Comparable. Quando un oggetto implementa questa interfaccia esso può implementare un metodo chiamato
Definizione di classi. Walter Didimo
Definizione di classi Walter Didimo Definizione di classi Fino ad ora abbiamo imparato a: creare oggetti da classi già pronte usare gli oggetti creati, invocando metodi la creazione e l uso di oggetti
16 - Ereditarietà, tipi e gerarchie
16 - Ereditarietà, tipi e gerarchie Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo
Esempio 2: Subtyping
Esempio 2: Subtyping 22 Subclassing e subtyping Fino ad ora abbiamo trattato l ereditarietà come strumento che consente il riuso flessibile di classi già esistenti mediante l aggiunta o la ridefinizione
Polimorfismo parametrico vs polimorfismo per inclusione
Polimorfismo parametrico vs polimorfismo per inclusione Esercizio Definire il tipo di dato Stack con operazioni Push( element ) Pop() Non forzare una specifica implementazione Non forzare un tipo specifico
Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà
L ereditarietà è il meccanismo attraverso cui viene implementata la relazione di specializzazione (is-a). L ereditarietà è il meccanismo attraverso cui una classe (derivata) eredita da un altra classe
public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;
Metodi iterativi con array monodimensionali 1. Scrivere un metodo che, dato un array di interi a, restituisce il valore minimo in a. public static int minimo (int[] a) { int min = a[0]; for (int i=1; i
18 - Classi parzialmente definite: Classi Astratte e Interfacce
18 - Classi parzialmente definite: Classi Astratte e Interfacce Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/
Le basi del linguaggio Java
Le basi del linguaggio Java Compilazione e interpretazione Quando si compila il codice sorgente scritto in Java, il compilatore genera il codice compilato, chiamato bytecode. È un codice generato per una
Politecnico di Milano
Appello 25 settembre 2015 Politecnico di Milano Anno accademico 2014-2015 Ingegneria del Software Cognome: DESIGN AND IMPLEMENTATION OF MOBILE APPLICATIONS 24 / 09 / 2015 Nome: Matricola: LAUREANDO Sezione
Programmazione orientata agli oggetti. Ivan Lanese
Programmazione orientata agli oggetti Ivan Lanese Argomenti Programmazione orientata agli oggetti Classi Oggetti Costruttori Scrivere grosse applicazioni La gran parte delle applicazioni sono GROSSE Windows
Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo
Programmazione Orientata agli Oggetti Emilio Di Giacomo e Walter Didimo Una metafora dal mondo reale la fabbrica di giocattoli progettisti Un semplice giocattolo Impara i suoni Dall idea al progetto Toy
Laboratorio di programmazione
Laboratorio di programmazione Lezione VIII Tatiana Zolo [email protected] 1 PROGRAMMAZIONE A OGGETTI Quando si programma a oggetti si scompone il problema in sottogruppi di parti collegate che tengono
Programmazione ad oggetti
Programmazione ad oggetti OOP La programmazione orientata agli oggetti (Object Oriented Programming) ha l obiettivo di formalizzare gli oggetti del mondo reale e di costruire con questi un mondo virtuale.
Implementazione Java di un ADT
Implementazione Java di un ADT Primo passo definire l'interfaccia (API) dell' ADT (l'api descrive i nomi dei metodi che l'adt supporta e come essi sono dichiarati e usati) Secondo passo scrivere il codice
14 - Metodi e Costruttori
14 - Metodi e Costruttori Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it
Linguaggi di programmazione II AA 2010/2011 Esercitazione 2
Linguaggi di programmazione II AA 2010/2011 Esercitazione 2 1) Scrivere l'output del seguente programma Java public class Bean private String str; Bean(String str ) this.str = str; public String tostring()
Programmazione in Java (I modulo)
Programmazione in Java (I modulo) Lezione 4 Variabili di tipo primitivo. Dichiarazione di costanti Conversioni di tipo: operatore cast Altri operatori di assegnamento Operazioni aritmetiche e di confronto
Synchronized (ancora)
Synchronized (ancora) Riscriviamo l esempio di prima. Usiamo una struttura modulare, con una classe Notificatore che ha opportuni metodi. La classe ha due campi privati, la lista buftext e un suo thread.
Java Virtual Machine. Indipendenza di java dalla macchina ospite. I threads in Java
programmi sorgente: files.java compilatore Indipendenza di java dalla macchina ospite Programmi java Programmi java Programmi java files.class bytecode linker/loader bytecode bytecode Java API files.class
Il Linguaggio Java. Le interfacce
Il Linguaggio Java Le interfacce Ordinamento dei conti PROBLEMA: si vogliono ordinare i libretti di risparmio (SavingsAccount) in base al loro tasso di interesse REQUISITO: La classe dovrebbe essere ordinabile,
Proprietà delle Classi e degli Oggetti in Java
Fondamenti di Informatica Proprietà delle Classi e degli Oggetti in Java Fondamenti di Informatica - D. Talia - UNICAL 1 Proprietà object-oriented di Java Definendo le caratteristiche e le operazioni di
Laboratorio di Programmazione Lezione 4. Cristian Del Fabbro
Laboratorio di Programmazione Lezione 4 Cristian Del Fabbro Prossima lezione Mercoledì 25 novembre ore 8:30-11:00 Classe Una classe descrive degli oggetti tramite: Proprietà/variabili/campi (dati/caratteristiche,
Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 11 luglio 2014 TEMPO DISPONIBILE: 2 ore Negli esercizi
Programmazione con Java
Programmazione con Java Classi e istanze in Java Definizione di classe in Java A meno che non si usino classi già scritte da altri, prima di poter creare un qualsiasi oggetto devo creare la sua rappresentazione:
Ricerca e ordinamento su array di oggetti. Corso di Programmazione 2 Esercitazione 5
Ricerca e ordinamento su array di oggetti Corso di Programmazione 2 Esercitazione 5 Sommario Ricercare in array di oggetti Interfaccia comparable Ordinare array di oggetti Problema Come ordinare, ricercare
Capitolo 5 - Funzioni
Capitolo 5 - Funzioni Divide and conquer Introduzione Costruire un programma da pezzi più piccoli o da singole componenti Questi pezzi più piccoli sono chiamati moduli Ogni singolo pezzo è più facilmente
19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
19 - Eccezioni Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso
Il linguaggio C. Puntatori e dintorni
Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;
Esempio su strutture dati dinamiche: ArrayList
Esempio su strutture dati dinamiche: ArrayList 1 ArrayList! Abbiamo detto che gli array non possono cambiare la propria dimensione: il numero di elementi contenuti viene stabilito al momento della creazione
In questa lezione. Polimorfismo
In questa lezione Polimorfismo (in Java) Tipo statico e tipo dinamico dei reference Binding dinamico (late binding) Casting (Upcasting e Downcasting) Operatore instanceof Polimorfismo con Object Polimorfismo
Metodi statici. Dichiarazione e chiamata di metodi statici
Metodi statici Dichiarazione e chiamata di metodi statici Cos è un metodo Un metodo è un blocco di istruzioni che fornisce una funzionalità e viene identificato con un nome Può avere dei parametri ed un
Fondamenti di Informatica T-1. Classi e metodi astratti
Classi e metodi astratti 2 Classi astratte L'ereditarietà è utile per rappresentare tassonomie e gerarchie di entità reali. Non sempre però tutti i livelli della gerarchia rappresentano entità concrete.
Alberi Binario in Java
Alberi Binario in Java Realizzare un albero binario di ricerca. L albero binario è di ricerca se esiste una relazione di ordinamento tra i valori dei nodi (valori comparabili). In particolare, dato un
Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre 2014. Negli esercizi proposti si utilizzano le seguenti classi:
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 22 settembre 2014 TEMPO DISPONIBILE: 2 ore Negli
Esercitazione. Docente Ing. Mariateresa Celardo
Esercitazione Docente Ing. Mariateresa Celardo [email protected] Scrivere la classe Motorino che ha i seguenti attributi colore: una stringa indicante il colore del motorino, velocità: un
La fase di progetto e realizzazione. PROGETTAZIONE DEL SOFTWARE (Ing. Gestionale) Diagramma delle classi realizzativo
Università di Roma La Sapienza, Facoltà di Ingegneria Corso di PROGETTAZIONE DEL SOFTWARE (Ing. Gestionale) Prof. Giuseppe De Giacomo & Monica Scannapieco Anno Accademico 2003/04 LA FASE DI PROGETTO E
Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro
Laboratorio di Programmazione Lezione 2 Cristian Del Fabbro Prossima lezione GIOVEDÌ 29 OTTOBRE 14:00 Input da tastiera package input; import java.io.*; public class Input { public static void main(string[]
Polimorfismo per Genericità in Java
Polimorfismo per Genericità in Java Corso di Linguaggi di Programmazione ad Oggetti 1 A.A. 2003/04 A cura di Polimorfismo Polimorfismo Ad-Hoc: Overloading Un metodo può essere sovraccaricato per manifestare
