Java类型安全等于()
作者:互联网
为什么Java中没有类型安全的equals()?我认为这有助于在编译期间捕获一些错误,而不是以后的运行时错误.
作为一个简单的例子考虑这个:
class Person {
Integer birthYear;
}
class Car {
Long releaseYear;
}
有一个方法来接收一个人和汽车的集合,并假设列出该人出生的同一年发布的所有汽车可能最终使用:
if (person.birthYear.equals(car.releaseYear)) {
...magic happens...
}
但使用它不会发生任何魔法.即使在创建代码期间字段是相同类型,也可以在以后更改任何一个,而不会在比较代码上出现编译错误.
什么是避免这类问题的最佳做法?
解决方法:
根据设计,Java的equals()方法接受一个Object,这样您就可以创建一个异构的对象集合,并将它们相互比较以实现相等性.
例如,您可能有一个任意对象列表:
List<Object> lst = new ArrayList<>();
lst.add("abc");
lst.add(123); // Integer
lst.add(456L); // Long
那么equals()接受Object的事实意味着你可以实现:
void indexOf(List<Object> lst, Object target) {
for (int i = 0; i < lst.size(); i++) {
if (lst.get(i).equals(target))
return i;
}
return -1;
}
要具体回答您的问题,“类型安全”的唯一方法是定义一个新的方法名称,如strictEquals(),并且只用您的类型而不是Object类型实现参数.例如:
class Person {
boolean strictEquals(Person other) { ... }
}
class Car {
boolean strictEquals(Car other) { ... }
}
关于使用Integer和Long作为字段,请不要这样做.使用基本类型int和long,并使用==运算符来比较值.这有许多优点,例如更好的性能,没有NullPointerException,以及正确地将int与long进行比较的能力(而Integer.equals(Long)将始终由于不同的类型而返回false,即使对象具有相同的数值) .
标签:java,equals,type-safety 来源: https://codeday.me/bug/20190628/1312378.html