为不同的值类型添加.equals()

时间:2011-11-29 19:03:22

标签: java equals

我有一个包含几个字段的类,其中一个是int,另外两个是long。我正在考虑做的是在equals()中添加一个检查,这样如果传入Integer个对象,它将比较int字段,如果相同的返回{{1 }}。同样,如果传入true,如果它位于2个Long字段之间,则会返回long

因此,如果我将其中的几个对象添加到trueList,我可以执行Set并让它自动为我提供匹配的第一个对象。我的想法是,如果我这样做,那么我只是进行get()调用,然后我会拥有它,而不是必须有一个额外的循环&检查。

与仅仅迭代所有对象并以这种方式进行比较相比,这是一个好主意还是坏主意?

4 个答案:

答案 0 :(得分:5)

不要这样做。

equals()方法有a well-defined contract,,您提出的实施方案违反了该方法。例如,它不会对称;如果x是您的对象且yInteger,则即使y.equals(x)为真,x.equals(y)也将为false。如果您更习惯于正确使用此方法,那么打破这些规则会让任何必须使用您的代码的人感到困惑 - 即使您将来也是如此。

您的用例听起来像是NavigableMap可以满足,其中键是整数,值是您班级的实例。

答案 1 :(得分:1)

性能将相同,但代码将被混淆。不同的开发人员(或者您自己在几个月内)只会期望equals()检查对象是否相等

我会寻求更明确的解决方案。

答案 2 :(得分:1)

你的equals方法应该有一个具体的实现,而不依赖于传递的Object的类型,读取等于合同here,因为读取你的代码或javadoc的任何人都希望它符合合同。

对于这种情况,您可以编写自己的自定义Comparator并使用它来搜索集合中的对象。

或者使用单独的等号方法,例如checkIntEqualitycheckLongEquality,并根据需要调用它们。

答案 3 :(得分:0)

只有当对象的语义遵循相同的逻辑时才有意义。

如果不同的类型代表不同的值,具有不同的含义,这种类型的重载会产生混淆。

听起来好像多头的“等于”甚至不等于平等,这更糟糕。

封装对象中的行为很好,但应该明智地命名。