java – 为什么我不应该使用equals继承?
当我读了一本
Java书时,作者曾经说过,在设计一个类时,使用equals()与继承通常是不安全的.例如:
public final class Date { public boolean equals(Object o) { // some code here } } 在上面的类中,我们应该把final,所以其他类不能继承.我的问题是,为什么允许另一个类继承自己是不安全的? 解决方法
因为很难(不可能?)使它正确,尤其是
symmetric property.
说你有班车和班车延长车.如果参数也是车辆并且具有相同的权重,Vehicle.equals()将成立.如果你想实现Car.equals(),它应该只有在参数也是一个车,而不是重量的时候应该产生一个真实值,它也应该比较make,引擎等. 现在想象下面的代码: Vehicle tank = new Vehicle(); Vehicle bus = new Car(); tank.equals(bus); //can be true bus.equals(tank); //false 如果巧合坦克和公共汽车重量相同,则首次比较可能会产生真实性.但是由于坦克不是一辆车,所以将它与汽车进行比较,总是会产生错误. 你几乎没有工作: > strict:当且仅当它们具有完全相同的类型(并且所有属性相等)时,两个对象相等.这是坏的,例如当你的子类几乎没有添加一些行为或装饰原始类.一些框架是子类化你的类,没有你注意到(Hibernate,Spring AOP与CGLIB代理…) 这可能是误导.采用两个LinkedHashSets(插入订单作为合同的一部分).然而,由于equals()仅考虑了原始Set合同,所以即使对于明显不同的对象,比较也将成为true: Set<Integer> s1 = new LinkedHashSet<Integer>(Arrays.asList(1,2,3)); Set<Integer> s2 = new LinkedHashSet<Integer>(Arrays.asList(3,1)); System.out.println(s1.equals(s2)); 也可以看看 > Java Basics Part 2: Equality and inheritance (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |