// Person.java import java.util.*; public class Person extends Observable implements NamedObject { static final String oStringChangedAddress = "changedAddress" .intern(); static final String oStringChangedName = "changedName" .intern(); static final String oStringChangedPhone = "changedPhone" .intern(); private Object oAddress; private Object oName; private Object oPhone; // CONSTRUCTORS public Person ( Object poName, Object poAddress, Object poPhone ) { oName = poName; oAddress = poAddress; oPhone = poPhone; } public Person ( String poName, String poAddress, String poPhone ) { oName = objectForString(poName ); oAddress = objectForString(poAddress ); oPhone = objectForString(poPhone ); } public Person ( ) { this("","",""); } // PUBLIC METHODS public boolean equals ( Object poObject ) { return (getClass() == poObject.getClass()) ?equalAttributes(poObject) :false; } public Object getAddress ( ) { return oAddress; } public Object getName ( ) { return oName; } public Object getPhone ( ) { return oPhone; } public int hashCode ( ) { return 0 ^ getAddress().hashCode() ^ getName ().hashCode() ^ getPhone ().hashCode() ; } public Object objectForString ( String poString ) { return poString; } public void setAddress ( Object poAddress ) { oAddress = poAddress; setChanged(); notifyObservers(oStringChangedAddress); } public void setName ( Object poName ) { oName = poName; setChanged(); notifyObservers(oStringChangedName); } public void setPhone ( Object poPhone ) { oPhone = poPhone; setChanged(); notifyObservers(oStringChangedPhone); } public String toString ( ) { return getName().toString(); } // PROTECTED METHODS protected boolean equalAttributes ( Object poObject ) { Person oPerson = (Person)poObject; return true && getName ().equals(oPerson.getName ()) && getAddress ().equals(oPerson.getAddress ()) && getPhone ().equals(oPerson.getPhone ()) ; } }