// Test program that uses CounterPoint as Point package org.effectivejava.examples.chapter03.item08; import java.util.HashSet; import java.util.Set; public class CounterPointTest { // Initialize UnitCircle to contain all Points on the unit circle private static final Set<Point> unitCircle; static { unitCircle = new HashSet<Point>(); unitCircle.add(new Point(1, 0)); unitCircle.add(new Point(0, 1)); unitCircle.add(new Point(-1, 0)); unitCircle.add(new Point(0, -1)); } public static boolean onUnitCircle(Point p) { return unitCircle.contains(p); } public static void main(String[] args) { Point p1 = new Point(1, 0); Point p2 = new CounterPoint(1, 0); // Prints true System.out.println(onUnitCircle(p1)); // Should print true, but doesn't if Point uses getClass-based equals System.out.println(onUnitCircle(p2)); } }