深入研究Java equals方法(二)

2014-11-23 23:31:31 · 作者: · 浏览: 1
ate String name;
  private int ago;
  private String sex;
  ....................
  public boolean equals(Object obj){
  quick check.......
  Human other = (Human)ojb;
  return this.name.equals(other.name) && this.ago == ohter.ago && this.sex.equals(other.sex);
  }
  }


  这是一个完全实现,但是,有时equals实现是在父类中实现,而要求被子类继承后equals能正确的工作,这时你并不事实知道子类到底扩展了哪些属性,所以用上面的方法无法使equals得到完全实现。

  一个好的方法是利用反射来对equals进行完全实现:

以下是引用片段:
  public boolean equals(Object obj){
  quick check.......
  Class c = this.getClass();
  Filed[] fds = c.getDeclaredFields();
  for(Filed f:fds){
  if(!f.get(this).equals(f.get(obj)))
  return false;
  }
  return true;
  }


  为了说明的方便,上明的实现省略了异常,这样的实现放在父类中,可以保证你的子类的equals可以按你的愿望正确地工作。关于equals方法的最后一点是:如果你要是自己重写(正确说应该是履盖)了equals方法,那同时就一定要重写hashCode().这是规范,否则.............

  我们还是看一下这个例子:

以下是引用片段:
  public final class PhoneNumber {
  private final int areaCode;
  private final int exchange;
  private final int extension;
  public PhoneNumber(int areaCode, int exchange, int extension) {
  rangeCheck(areaCode, 999, "area code");
  rangeCheck(exchange, 99999999, "exchange");
  rangeCheck(extension, 9999, "extension");
  this.areaCode = areaCode;
  this.exchange = exchange;
  this.extension = extension;
  }
  private static void rangeCheck(int arg, int max, String name) {
  if(arg < 0 || arg > max)
  throw new IllegalArgumentException(name + ": " + arg);
  }
  public boolean equals(Object o) {
  if(o == this)
  return true;
  if(!(o instanceof PhoneNumber))
  return false;
  PhoneNumber pn = (PhoneNumber)o;
  return pn.extension == extension && pn.exchange == exchange && pn.areaCode == areaCode;
  }
  }


  注意这个类是final的,所以这个equals实现没有什么问题。我们来测试一下:

以下是引用片段:
  public static void main(String[] args) {
  Map hm = new HashMap();
  PhoneNumber pn = new PhoneNumber(123, 38942, 230);
  hm.put(pn, "I love you");
  PhoneNumber pn1 = new PhoneNumber(123, 38942, 230);
  System.out.println(pn);
  System.out.println("pn.equals(pn1) is " + pn.equals(pn1));
  System.out.println(hm.get(pn1));
  System.out.println(hm.get(pn));