繁体   English   中英

Java类型安全等于()

[英]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) { ... }
}

关于使用IntegerLong作为字段, 请不要这样做 使用基本类型intlong ,并使用==运算符来比较值。 这有许多优点,例如更好的性能,没有NullPointerException ,以及正确地将intlong进行比较的能力(而Integer.equals(Long)将始终由于不同的类型而返回false,即使对象具有相同的数值) 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM