Java 这样行吗?

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的属性实现

我有一个缓存实现,我为它实现了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的属性实现了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()
    中是完全合适的。你的例子是正确的。是的,很抱歉不是,而是,我错过了代码第一次做的事情。