[英]Java type safe equals()
为什么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,即使对象具有相同的数值) 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.