Uguaglianza equals() e clone(). Fondamenti di Java Uguali o identici?

Slides:



Advertisements
Similar presentations
Uguaglianza equals() e clone(). Fondamenti di Java Uguali o identici?
Advertisements

Uguaglianza equals() e clone(). Fondamenti di Java Uguali o identici?
Clonazione La clonazione... Ovvero: come costruire una copia (probabilmente che ritorni true su equals?)
Lecture 5: Interfaces.
Basic -2 Classes and Objects. Classes and Objects A class is a complex data TYPE An object is an instance of a class. Example: Class: Person Objects:
 Specifies a set of methods (i.e., method headings) that any class that implements that interface must have.  An interface is a type (but is not a class).
Inheritance // A simple class hierarchy. // A class for two-dimensional objects. class TwoDShape { double width; double height; void showDim() { System.out.println("Width.
Identity and Equality Based on material by Michael Ernst, University of Washington.
Public class ABC { private int information = 0; private char moreInformation = ‘ ‘; public ABC ( int newInfo, char moreNewInfo) { } public ABC () {} public.
Problem Solving 5 Using Java API for Searching and Sorting Applications ICS-201 Introduction to Computing II Semester 071.
Singleton vs utility class  at first glance, the singleton pattern does not seem to offer any advantages to using a utility class  i.e., a utility class.
Effective Java, Chapter 3: Methods Common to All Objects.
1 Class Design CS 3331 Fall Outline  Organizing classes  Design guidelines  Canonical forms of classes equals method hashCode method.
Effective Java, Chapter 3: Methods Common to All Objects Paul Ammann.
IntroductionIntroduction  Computer program: an ordered sequence of statements whose objective is to accomplish a task.  Programming: process of planning.
1 More on Inheritance Overview l Object: The father of all classes l Casting and Classes l Object Cloning l Importance of Cloning.
CS2200 Software Development Lecture: Object class A. O’Riordan, 2008.
1 Java Object Model Part 2: the Object class. 2 Object class Superclass for all Java classes Any class without explicit extends clause is a direct subclass.
CMSC 132 Week2 Lab1 Comparable vs Comparator clone() finalize()
GETTING INPUT Simple I/O. Simple Input Scanner scan = new Scanner(System.in); System.out.println("Enter your name"); String name = scan.nextLine(); System.out.println("Enter.
1 Inheritance and Polymorphism Chapter 9. 2 Polymorphism, Dynamic Binding and Generic Programming public class Test { public static void main(String[]
1 Identifiers  Identifiers are the words a programmer uses in a program  An identifier can be made up of letters, digits, the underscore character (
Announcements  I will discuss the labtest and the written test #2 common mistakes, solution, etc. in the next class  not today as I am still waiting.
Puzzle 3 1  Write the class Enigma, which extends Object, so that the following program prints false: public class Conundrum { public static void main(String[]
Non-static classes Part 2 1. Methods  like constructors, all non-static methods have an implicit parameter named this  for methods, this refers to the.
The java.lang Package chapter 8 Java Certification Study Group February 2, 1998 Seth Ladd.
Does not implement clone() method! public class Bar { … public Object clone() { … } Does not implement Cloneable interface!
Java Language Basics By Keywords Keywords of Java are given below – abstract continue for new switch assert *** default goto * package.
Effective Java: Methods Common to All Objects SWE 619: Fall 2008 Paul Ammann.
Java Type System and Object Model Horstmann ch , 7.7.
Application development with Java Lecture 21. Inheritance Subclasses Overriding Object class.
1 Class Design CS 3331 Sec 6.1 & 6.3 of [Jia03]. 2 Outline  Organizing classes  Design guidelines  Canonical forms of classes equals method hashCode.
CS 151: Object-Oriented Design November 12 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak
(c) University of Washington06-1 CSC 143 Java Inheritance Tidbits.
1 Chapter 8 Class Inheritance and Interfaces F Superclasses and Subclasses  Keywords: super F Overriding methods  The Object Class  Modifiers: protected,
1 Object-Oriented Programming Inheritance. 2 Superclasses and Subclasses Superclasses and Subclasses  Superclasses and subclasses Object of one class.
CSC142 NN 1 CSC 142 Overriding methods from the Object class: equals, toString.
Reference Types CSE301 University of Sunderland Harry R Erwin, PhD.
1 CSE 331 The Object class; Object equality and the equals method slides created by Marty Stepp based on materials by M. Ernst, S. Reges, D. Notkin, R.
The Object class Object package java.lang Object clone equals hashCode toString aCopy toThis hash string ! yesOrNo.
Polymorphism 1. Reuse of code: every time a new sub-class is defined, programmers are reusing the code in a super-class. All non-private members of a.
1 clone() Defined in Object Creates an identical copy –Copies pointers to fields (does not copy fields of fields) –Makes a shallow copy if the object’s.
Lecture 25: Inheritance and Polymorphism
C11, Implications of Inheritance
Lecture 12 Inheritance.
CSC 205 Java Programming II
Interfaces.
COMP 110 Some notes on inheritance, review
Computer Science II Exam 1 Review.
Overloading and Constructors
Класс Object Макаревич Л. Г..
null, true, and false are also reserved.
The Language Package.
CSE 1030: Implementing Non-Static Features
CSE 143 Lecture 24 Inheritance and the Object class; Polymorphism
Sampath Kumar S Assistant Professor, SECE
JavaScript Reserved Words
Effective Java, Chapter 3, 3rd Edition: Methods Common to All Objects
Overriding methods from the Object class: equals, toString
Lecture 25: Inheritance and Polymorphism
Chapter 8 Class Inheritance and Interfaces
CSE 143 Lecture 24 Inheritance and the Object class; Polymorphism
CSE 143 Lecture 24 Inheritance and the Object class; Polymorphism
Clonazione La clonazione... Ovvero: come costruire una copia
CSE 143 Lecture 23 Inheritance and the Object class; Polymorphism
Agenda Types and identifiers Practice Assignment Keywords in Java
Review for Midterm 3.
Inheritance Lakshmish Ramaswamy.
CS 240 – Advanced Programming Concepts
Presentation transcript:

Uguaglianza equals() e clone()

Fondamenti di Java Uguali o identici?

Class P class P { int x; int y; public String toString() { return ("x="+x+" ; y="+y); }

Main di test public class Test { public static void main(String []a){new Test();} Test() { P p1=new P(); p1.x=1; p1.y=2; System.out.println(p1); P p2=p1; p2.x=3; System.out.println(p1); } class P { int x; int y; public String toString() { return ("x="+x+" ; y="+y); }

Main di test public class Test { public static void main(String []a){new Test();} Test() { P p1=new P(); p1.x=1; p1.y=2; System.out.println(p1); P p2=p1; p2.x=3; System.out.println(p1); } class P { int x; int y; public String toString() { return ("x="+x+" ; y="+y); } x=1 ; y=2 x=3 ; y=2 p1 and p2 refer to te same object!

Oggetti diversi public class Test { public static void main(String a[]) {new Test();} Test() { P p1=new P(); p1.x=1; p1.y=2; System.out.println(p1); P p2=new P(); p2.x=1; p2.y=2; System.out.println(p2); p1.x=3; System.out.println(p1); System.out.println(p2); } x=1 ; y=2 x=3 ; y=2 x=1 ; y=2

Come testare l'eguaglianza? public class Test { public static void main(String a[]){new Test();} Test() { P p1=new P(); p1.x=1; p1.y=2; P p2=new P(); p2.x=1; p2.y=2; // come testare l'uguaglianza di p1 e p2? }

Operatore == public class Test { public static void main(String[] a){new Test();} Test() { P p1=new P(); p1.x=1; p1.y=2; P p2=new P(); p2.x=1; p2.y=2; System.out.println(p1 == p2); } false

Metodo equals() public class Test { public static void main(String[] a){new Test();} Test() { P p1=new P(); p1.x=1; p1.y=2; P p2=new P(); p2.x=1; p2.y=2; System.out.println(p1.equals(p2)); } false

Metodo equals() The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any reference values x and y, this method returns true if and only if x and y refer to the same object (x==y has the value true). Ma allora a che serve?

equals per la classe P class P { int x; int y; public String toString() { return ("x="+x+" ; y="+y); } public boolean equals(P var){ return (x==var.x && y==var.y) } Equals di Object è la base per implementare il vostro equals

equals() e == public class Test { public static void main(String[] a){new Test();} Test() { P p1=new P(); p1.x=1; p1.y=2; P p2=new P(); p2.x=1; p2.y=2; System.out.println(p1.equals(p2)); System.out.println(p1 == p2); } true false

Problema 1… public class Test { public static void main(String[] a)}new Test();} Test() { P p1=new P(); p1.x=1; p1.y=2; P p2=null; System.out.println(p1.equals(p2)); System.out.println(p1 == p2); } Error!

equals per la classe P, v.2 class P { int x; int y; public String toString() { return ("x="+x+" ; y="+y); } public boolean equals(P var){ if(var==null) return false; return (x==var.x && y=var.y) }

Problema 2… Equals deve comparare due Objects! public class Test { public static void main(String[] a)}new Test();} Test() { P p1=new P(); p1.x=1; P1.y=2; Integer p2=new Integer(3); System.out.println(p1.equals(p2)); System.out.println(p1 == p2); } false

equals per la classe P, v.3 class P { int x; int y; public String toString() { return ("x="+x+" ; y="+y); } public boolean equals(Object var){ if (!(var instanceof P)) return false; if(var==null) return false; return (x==((P)var).x && y=((P)var).y) }

Problema 3… public class Test { public static void main(String[] a)}new Test();} Test() { P p1=new P(); p1.x=1; p1.y=2; Q p2=new Q(); p2.x=1; p2.y=2; System.out.println(p1.equals(p2)); System.out.println(p1 == p2); } true false Class Q extends P { int z; }

equals per la classe P, v.3b class P { int x; int y; public String toString() { return ("x="+x+" ; y="+y); } public boolean equals(Object var){ if(var==null) return false; if (var.getClass() != this.getClass()) return false; return (x==((P)var).x && y=((P)var).y) }

e ora… public class Test { public static void main(String[] a)}new Test();} Test() { P z1=new P(); p1.x=1; P1.y=2; Q p2=new Q(); p2.x=1; p2.y=2; System.out.println(p1.equals(p2)); System.out.println(p1 == p2); } false Class Q extends P { int z; }

Quale soluzione scegliere? if (o.getClass() != this.getClass()) return false; oppure if (!(var instanceof P)) return false; ? Dipende...

Proprietà richieste ad equals The equals method implements an equivalence relation: It is reflexive: for any reference value x, x.equals(x) should return true. It is symmetric: for any 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 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.

Proprietà richieste ad equals Additional properties: It is consistent: for any 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 object is modified. For any non-null reference value x, x.equals(null) should return false.

equals e hashCode Programmers should take note that any class that overrides the Object.equals method must also override the Object.hashCode method in order to satisfy the general contract for the Object.hashCode method. In particular, c1.equals(c2) implies that c1.hashCode()==c2.hashCode() (the vice versa need not be true)

Implementazione di hashCode public int hashCode() { int hash = 0; /* a typical implementation: for (int i = 0; i < len; i++) { hash = 31* hash + val[i]; } */ hash = x*31+y; return hash; }

A che serve hashCode? chiave1coda1 chiave2coda2 chiave3coda3... O1O6 O2 O4 O3O5 Tabelle associative Dato un oggetto O1 è possibile calcolarne la chiave C1

Clonazione La clonazione... Ovvero: come costruire una copia (probabilmente che ritorni true su equals?)

Metodo clone di Object protected Object clone() throws CloneNotSupportedException Creates and returns a copy of this object. The precise meaning of "copy" may depend on the class of the object. The general intent is that, for any object x, the expression: x.clone() != x will be true, and that the expression: x.clone().getClass() == x.getClass() will be true, but these are not absolute requirements. While it is typically the case that: x.clone().equals(x) will be true, this is not an absolute requirement.

Main di test public class Test { public static void main(String []a){new Test();} Test() { P p1=new P(); p1.x=1; p1.y=2; P p2=p1.clone(); // NO! Metodo protected! System.out.println(p2); } class P { int x; int y; public String toString() { return ("x="+x+" ; y="+y); }

clone per la classe P class P implements Cloneable { … public Object clone(){ try { return super.clone(); } catch (CloneNotSupportedException e) { System.err.println("Implementation error"); System.exit(1); } return null; //qui non arriva mai } } Copia bit a bit

public class Test { public static void main(String []a){new Test();} Test() { P p1=new P(); p1.x=5; p1.y=6; P p2=p1; P p3=p1.clone(); System.out.println(p1); System.out.println(p2); System.out.println(p3); p1.x=7 System.out.println(p1); System.out.println(p2); System.out.println(p3); } Main di test x=5 ; y=6 x=7 ; y=6 x=5 ; y=6

Class V class V implements Cloneable { int x[]; V(int s) { x=new int[s]; for (int k=0;k<x.length;k++) x[k]=k; } public String toString() { String s=""; for (int k=0;k<x.length;k++) s=s+x[k]+" "; return s; }... // clone definito come prima }

Main di test public class Test { public static void main(String []a){new Test();} Test() { V p1=new V(5); V p2=p1.clone(); System.out.println(p1); System.out.println(p2); p1.x[0]=9; System.out.println(p1); System.out.println(p2); }

A better clone… class V implements Cloneable { int x[];V(int s){…}public String toString(){…} public Object clone(){ Object tmp=null; try { tmp=super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } ((V)tmp).x=new int[x.length]; for (int k=0;k<x.length;k++)((V)tmp).x[k]=x[k]; return tmp; }

Main di test public class Test { public static void main(String []a){new Test();} Test() { V p1=new V(5); V p2=p1.clone(); System.out.println(p1); System.out.println(p2); p1.x[0]=9; System.out.println(p1); System.out.println(p2); }

Shallow vs. Deep copy super.clone() Effettua una SHALLOW COPY Per ottenere una DEEP COPY occorre modificane il risultato. Ogni volta che ho delle referenze tra le variabili di istanza, devo chiedermi se voglio fare una copia della referenza o dell'oggetto!