1 Class Design CS 3331 Sec 6.1 & 6.3 of [Jia03]. 2 Outline Organizing classes Design guidelines ...
-
Upload
douglas-allen -
Category
Documents
-
view
216 -
download
0
description
Transcript of 1 Class Design CS 3331 Sec 6.1 & 6.3 of [Jia03]. 2 Outline Organizing classes Design guidelines ...
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 method
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
Client LinkedList Node<<use>>
public class helper class
0,20,2
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
Outline
Public vs helper classes Design guidelines Canonical forms of classes
equals method hashCode method
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
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
Separation through Interfaces
Client <<interface>>List
uses
LinkedList ArrayList
service provider
service user
9
Outline
Public vs. helper classes Design guidelines Canonical forms of classes
equals method hashCode method
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<Point> 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
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
The toString Method
Why?
public class Point {
private int x, y;
/* … */
public String toString() { return “Point(“ + x + “, “ + y + “)”; }}
Default behavior: Point@1a46e30
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
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 = 10y = 20
p1:
: Point
x = 10y = 20
p2:
p3:
Point p1 = new Point(10, 20);Point p2 = new Point(10, 20);Point p3 = p1;
15
Equality (Cont.) Default implementation of equals method
Inherited from the class Object Test for object identity
Can be overridden by subclasses
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
Exercise Define equals method for the class Point.
Assume that the class has two fields x and y, both of type int.
18
Template for equals MethodProposal 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
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
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
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
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
Outline
Public vs. helper classes Design guidelines Canonical forms of classes
equals method hashCode method
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
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 <<for each field compute and combine the hash code>> return result;}
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
How to Combine Hash Code? Bitwise-or (|)
result = result << n | h;where n is an arbitrary integer constant, e.g., 8.
Additionresult = result * p + h;where p is a prime number, e.g., 37.
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
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.