Java 这样行吗?
我有一个缓存实现,我为它实现了KeyObject 所以缓存是Java 这样行吗?,java,equals,Java,Equals,我有一个缓存实现,我为它实现了KeyObject 所以缓存是HashMap 这个KeyObject类,假设它有2个变量a,b class KeyObject { MyObject a; AnotherMyObject b; KeyObject(MyObject a, AnotherMyObject b){ this.a = prop1 ; this.b= prop2; } } 我根据MyObject和AnotherMyObject的属性实现
HashMap
这个KeyObject类,假设它有2个变量a,b
class KeyObject {
MyObject a;
AnotherMyObject b;
KeyObject(MyObject a, AnotherMyObject b){
this.a = prop1 ; this.b= prop2;
}
}
我根据MyObject和AnotherMyObject的属性实现了equals方法,这样可以吗
说这样的话
public boolean equals(Object keyObject){
if(keyObject.isSomeType() && this.a.isSomeType(){
return keyObject.a.equals(this.a)
}
else{
return keyObject.a.equals(this.a) && keyObject.b.equals(this.b)
}
}
上述平等的实现是否是一种常见的做法
谢谢三件事:
instanceof
确保另一个对象的类型正确对象
转换为关键对象
// Override annotation gives you bonus points :)
@Override
public boolean equals(Object other) {
if (other == null)
return false;
if (!(other instanceof KeyObject))
return false;
KeyObject keyObject = (KeyObject) other;
// I'm not exactly sure what this line is doing
// but I assume it's part of your program.
if(keyObject.isSomeType() && this.a.isSomeType()
return keyObject.a.equals(this.a);
else
return keyObject.a.equals(this.a) && keyObject.b.equals(this.b);
}
我在谷歌搜索时发现了这本指南:
- 对象字段,包括集合:使用等于
- 类型安全枚举:使用等于或==(在本例中,它们等于相同的值)
- 可能为空的对象字段:同时使用==和equals
- 数组字段:使用Arrays.equals
- 除float或double以外的基本字段:使用==
- float:使用float.floatToIntBits转换为int,然后使用==
- double:使用double.double到longbits转换为long,然后使用==
我认为这些指导原则基本上就是您所需要的。谢谢您的编辑。在你完成之前,我正试着这么做!!您看到了吗?在任何情况下,您还必须实现
hashCode
,并确保它为相等的对象返回相同的值。请使用instanceof
当然,但可能不能代替isSomeType()
。如果isSomeType()
包含重要的业务逻辑,那么将其放在equals()
中是完全合适的。你的例子是正确的。是的,很抱歉不是,而是,我错过了代码第一次做的事情。