为什么我不应该在继承中使用平等?

hqt:

当我读一本Java书籍时,作者曾说过,在设计类时,equals()与继承一起使用通常是不安全的例如:

public final class Date {
    public boolean equals(Object o) {
         // some code here
    }
}

在上面的类中,我们应放置final,以便其他类不能从此继承。我的问题是,为什么允许另一个类从中继承是不安全的?

Tomasz Nurkiewicz:

因为很难(不可能?)做到正确,尤其是对称属性

说你有一Vehicle堂课Car extends VehicleVehicle.equals()产生true如果参数也是Vehicle并且具有相同的重量。如果要实现,Car.equals()true仅当参数也是汽车(重量除外)时,它才应屈服,并且还应比较制造商,发动机等。

现在想象下面的代码:

Vehicle tank = new Vehicle();
Vehicle bus = new Car();
tank.equals(bus);  //can be true
bus.equals(tank);  //false

true如果巧合的是,油箱和客车的重量相同,则第一个比较可能会得出结果但是由于坦克不是汽车,因此将其与汽车相比较总是可以得到收益的false

您有几种解决方法:

  • 严格:两个对象只有且具有完全相同的类型(并且所有属性都相同)时才相等。这很不好,例如,当您几乎没有子类化以添加某些行为或装饰原始类时。一些框架也在不引起您注意的情况下对您的类进行子类化(Hibernate,带有CGLIB代理的Spring AOP ...)

  • 松散的:如果两个对象的类型“兼容”并且它们的内容(语义上)相同,则它们是相等的。例如,如果两个集合包含相同的元素,则它们是相等的,一个HashSet与另一个无关紧要TreeSet(感谢@veer指出这一点)。

    这可能会产生误导。取2 LinkedHashSets(其中插入顺序作为合同的一部分很重要)。但是,由于equals()仅考虑原始Set合同,因此true即使对于明显不同的对象,该比较也会产生收益

    Set<Integer> s1 = new LinkedHashSet<Integer>(Arrays.asList(1, 2, 3));
    Set<Integer> s2 = new LinkedHashSet<Integer>(Arrays.asList(3, 2, 1));
    System.out.println(s1.equals(s2));
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们不应该在Java中使用受保护的静态

为什么我不应该在PHP中使用mysql_ *函数?

为什么我不应该在Android中使用System.out.println()

为什么我不应该在React Redux中使用toJS()?(mapStateToProps)

为什么我们不应该在py脚本中使用sys.setdefaultencoding(“ utf-8”)?

为什么不应该在python中使用list.sort

为什么有人不应该在命令行中使用密码?

为什么不应该在ES6中使用全部导入

为什么不应该在财务交易中使用nosql

为什么不应该在PHP中使用mysql_ *函数?

为什么我不应该在ARMv6 +的系统内存上使用ioremap?

为什么我的函数返回零为什么它不应该在 R 中

为什么我不应该在Java8中的Optional上使用基于身份的操作?

如果PyPy快6.3倍,为什么我不应该在CPython上使用PyPy?

为什么我们不应该在同一层使用多个激活功能?

为什么我们不应该在 ComponentDidMount 中设置状态

为什么我不应该在JNI中重用jclass和/或jmethodID?

为什么我不应该在Spout.nextTuple()中循环或阻止

为什么我不应该在Angular 2的组件中提供服务

为什么我不应该在网站上显示滚动条?

rails-我不应该在Rails迁移中使用默认值

我不应该在html中使用数据属性吗?

为什么不应该在防火墙外部使用TCP绑定?

为什么我应该在Flutter中使用Cards?

为什么 exec 永远不应该在调用代码的命名空间中使用?使用 exec 设置类实例属性

为什么我不应该在计算机机箱附近放置会产生静电的物品?

什么时候(不应该)我应该在Android上测试UI组件?

我不应该在小规模生产项目中使用Angular 2 Alpha吗?

为什么 PHP 内置 web 服务器不应该在公共网络上使用?