Presentation is loading. Please wait.

Presentation is loading. Please wait.

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.

Similar presentations


Presentation on theme: "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."— Presentation transcript:

1 1 Class Design CS 3331 Sec 6.1 & 6.3 of [Jia03]

2 2 Outline  Organizing classes  Design guidelines  Canonical forms of classes equals method hashCode method

3 3 Public vs. Helper Classes  Motivation To hide implementation decisions and details from clients  Approach Separate helper classes and make them NOT visible to clients Public classes: for general use by clients Helper (or auxiliary) classes: used solely to implement public classes ClientLinkedListNode > public class helper class 0,2

4 4 Organizing Helper Classes  Approaches Separate (standalone) classes in separate files Separate (standalone) classes in the same file Nested classes: static, non-static (inner), local inner, anonymous inner public class LinkedList { protected Node head, tail; /* … */ protected static class Node { private Object value; private Node next, prev; /* … */ }

5 5 Outline Public vs helper classes  Design guidelines  Canonical forms of classes equals method hashCode method

6 6 Design Guidelines  G1: Avoid public fields To minimize accessibility of fields Make fields non-public (e.g., private attributes) Provide accessors (e.g., getAttr() or isAttr()) Provide mutators (e.g., setAttr())  G2: Completeness of public interfaces  G3: Separate interface from implementation

7 7 Question  Which is better and why? public class StudentBody1 { private ArrayList students; /* … */ public void addAll(ArrayList students) { /* … */ } } public class StudentBody2 { private List students; /* … */ public void addAll(List students) { /* … */ } }

8 8 Separation through Interfaces Client > List uses LinkedList ArrayList service provider service user

9 9 Outline Public vs. helper classes Design guidelines  Canonical forms of classes equals method hashCode method

10 10 Canonical Form of Classes  Objective To ensure that objects behave “well” when manipulated by Java runtime environment and other classes. // E.g., what will be printed? List points = new LinkedList<>(); points.add(new Point(10, 20)); If (points.contains(new Point(10, 20))) { System.out.println(“Found!”); } else { System.out.println(“Not found!”); }

11 11 Canonical Form (Cont.)  Canonical forms of public classes String representation  toString method No-argument constructor Object equality  equals and hashCode methods Cloning  Cloneable interface and clone method Serialization  Serializable interface and readObject and writeObject methods

12 12 The toString Method  Why? public class Point { private int x, y; /* … */ public String toString() { return “Point(“ + x + “, “ + y + “)”; } Default behavior: Point@1a46e30

13 13 No-argument Constructor  Why? public class Point { private int x, y; /* … */ public Point() { this(0, 0); } public Point(int x, int y) { this.x = x; this.y = y; }

14 14 Equality  Identity equality vs. value quality “==“ vs. equals() “==“ implies equals() Is “p1 == p2” ? Is “p1.equals(p2)” ? Is “p1 == p3” ? Is “p1.equals(p3)” ? : Point x = 10 y = 20 p1: : Point x = 10 y = 20 p2: p3: Point p1 = new Point(10, 20); Point p2 = new Point(10, 20); Point p3 = p1;

15 15 Equality (Cont.)  Default implementation of equals method Inherited from the class Object Test for object identity  Can be overridden by subclasses

16 16 Contract of Equality  Equivalence relation Reflective: x.equals(x) Symmetric: x.equals(y)  y.equals(x) Transitive: x.equals(y)  y.equals(z)  x.equals(z)  Consistency x.equals(y) consistently returns true or false  Nonnullity x.equals(null) always returns false

17 17 Exercise  Define equals method for the class Point. Assume that the class has two fields x and y, both of type int.

18 18 Template for equals Method Proposal 1: for class T public boolean equals(Object other) { if (this == other) { return true; } if (other instanceof T) { T otherObj = (T) other; << compare each significant field and return false if not equals>> return true; } return false; } Q: What is wrong? For class Point: public boolean equals(Object o) { if (this == o) { return true; } if (o instanceof Point) { Point p = (Point) o; return x == p.x && y == p.y; } return false; } Point -x: int -y: int

19 19 Perfect equals Method public boolean equals(Object other) { if (this == other) { return true; } if (other == null) { return false; } if (getClass() != other.getClass()) { return false; } T otherObj = (T) other; << compare each significant field and return false if not equals>> return true; }

20 20 Comparing Fields if (f != otherObj.f) { return false; }  Primitive types if (f == null ? otherObj.f != null : !f.equals(otherObj.f)) { return false; }  Reference types

21 21 Template for equals Method When T has a superclass: public boolean equals(Object other) { if (!super.equals(other)) { return false; } T otherObj = (T) other; << compare each significant field and return false if not equals>> return true; }

22 22 Exercise  Define equals method for the class ColoredPoint, a subclass of the class Point. Assume that the class has an additional field named color of type Color.

23 23 Outline Public vs. helper classes Design guidelines  Canonical forms of classes equals method hashCode method

24 24 The hashCode Method  Purpose Returns the hash code of an object Used by hash-table-based collection classes (e.g., HashMap, HashSet)  Contract for hashCode x.equals(y)  x.hashCode() == y.hashCode()

25 25 Defining hashCode Methods  General scheme Compute hash code for each significant field Combine hash code of all significant fields public int hashCode() { int result = 0; // accumulative hash code int h; // hash code for a field > return result; }

26 26 Computing hash code for fields  boolean fields f ? 0: 1  byte, char, short, and int fields (int) f  long fields (int)(f ^ (f >>> 32))  float fields Float.floatToIntBits(f)  double fields Double.doubleToLongBits(f) and then to int  References If null, then 0 (or some fixed value), Recursive equals  recursive hash on fields, or Hash on canonical representation

27 27 How to Combine Hash Code?  Bitwise-or (|) result = result << n | h; where n is an arbitrary integer constant, e.g., 8.  Addition result = result * p + h; where p is a prime number, e.g., 37.

28 28 Example  Hashcode method for class Point public int hashCode() { int result = x; result = result << 8 | y; return result; } public int hashCode() { int result = x; result = result * 37 + y; return result; }

29 29 Exercise  Write a hashCode method for the class ColoredPoint, a subclass of the class Point. Assume that the class has an additional field color of type Color.


Download ppt "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."

Similar presentations


Ads by Google