什么时候改写:1逻辑相等2确保不被调用时,改写之以抛出异常
约定:自反性,对称性,传递性,一致性,非空性
作者主要解释了对称性,传递性,一致性,
一致性,不要依赖于一些不稳定的因素,如网络等等
对称性,A很花哨的修改了equals方法,终于equal了B,但是B不为所动,不去equal A,
这一般出现在自定义类和其他类库的类equal的时候,譬如书中的CaseInsensitiveString和JDK的String。
作者着重讲述了传递性,例子讲的是增加了成员变量的子类,如果维持和父类equals,结果就丧失了传递性,JDK里的例子Timestamp和Date也是如此。
查看了下TimeStamp.equals()的api,里面有这样一句话,相对于基类中的 equals(Object) 方法而言,此方法是不对称的,此处基类就是指Date啦,Date可以equal Timestamp,但是TimeStamp不能equal Date,结论是,没法解决,除非父类不可实例化,子类之和子类之间equal,那就不会有问题,不然就别用继承,用复合。
关于非空性,作者简略了说了一句,但本人觉得很有用:不需要去判断Object o是否为null在instanceof的时候已经包含了这个功能。
如何写equals
1.先用==看是不是自己
2.instanceof
3.4.5,不写了,你懂的
告诫:
1.要改写hashcode()
2.不要过度的寻求等价关系
3.不要依赖于不稳定资源,防止不一致
4.别把重写变成重载,错误写法equals(MyClass o)
约定:自反性,对称性,传递性,一致性,非空性
作者主要解释了对称性,传递性,一致性,
一致性,不要依赖于一些不稳定的因素,如网络等等
对称性,A很花哨的修改了equals方法,终于equal了B,但是B不为所动,不去equal A,
这一般出现在自定义类和其他类库的类equal的时候,譬如书中的CaseInsensitiveString和JDK的String。
作者着重讲述了传递性,例子讲的是增加了成员变量的子类,如果维持和父类equals,结果就丧失了传递性,JDK里的例子Timestamp和Date也是如此。
查看了下TimeStamp.equals()的api,里面有这样一句话,相对于基类中的 equals(Object) 方法而言,此方法是不对称的,此处基类就是指Date啦,Date可以equal Timestamp,但是TimeStamp不能equal Date,结论是,没法解决,除非父类不可实例化,子类之和子类之间equal,那就不会有问题,不然就别用继承,用复合。
关于非空性,作者简略了说了一句,但本人觉得很有用:不需要去判断Object o是否为null在instanceof的时候已经包含了这个功能。
如何写equals
1.先用==看是不是自己
2.instanceof
3.4.5,不写了,你懂的
告诫:
1.要改写hashcode()
2.不要过度的寻求等价关系
3.不要依赖于不稳定资源,防止不一致
4.别把重写变成重载,错误写法equals(MyClass o)