我有一个包含几个字段的类,其中一个是int
,另外两个是long
。我正在考虑做的是在equals()
中添加一个检查,这样如果传入Integer
个对象,它将比较int
字段,如果相同的返回{{1 }}。同样,如果传入true
,如果它位于2个Long
字段之间,则会返回long
。
因此,如果我将其中的几个对象添加到true
或List
,我可以执行Set
并让它自动为我提供匹配的第一个对象。我的想法是,如果我这样做,那么我只是进行get()
调用,然后我会拥有它,而不是必须有一个额外的循环&检查。
与仅仅迭代所有对象并以这种方式进行比较相比,这是一个好主意还是坏主意?
答案 0 :(得分:5)
不要这样做。
equals()
方法有a well-defined contract,,您提出的实施方案违反了该方法。例如,它不会对称;如果x
是您的对象且y
是Integer
,则即使y.equals(x)
为真,x.equals(y)
也将为false。如果您更习惯于正确使用此方法,那么打破这些规则会让任何必须使用您的代码的人感到困惑 - 即使您将来也是如此。
您的用例听起来像是NavigableMap
可以满足,其中键是整数,值是您班级的实例。
答案 1 :(得分:1)
性能将相同,但代码将被混淆。不同的开发人员(或者您自己在几个月内)只会期望equals()
检查对象是否相等。
我会寻求更明确的解决方案。
答案 2 :(得分:1)
你的equals方法应该有一个具体的实现,而不依赖于传递的Object的类型,读取等于合同here,因为读取你的代码或javadoc的任何人都希望它符合合同。
对于这种情况,您可以编写自己的自定义Comparator
并使用它来搜索集合中的对象。
或者使用单独的等号方法,例如checkIntEquality
和checkLongEquality
,并根据需要调用它们。
答案 3 :(得分:0)
只有当对象的语义遵循相同的逻辑时才有意义。
如果不同的类型代表不同的值,具有不同的含义,这种类型的重载会产生混淆。
听起来好像多头的“等于”甚至不等于平等,这更糟糕。
封装对象中的行为很好,但应该明智地命名。