代码之家  ›  专栏  ›  技术社区  ›  Peter Warbo

试图理解Eclipse生成的equals方法

  •  0
  • Peter Warbo  · 技术社区  · 12 年前

    这是Eclipse生成的代码:

    id 是一个 String

    @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Person other = (Person) obj;
            if (id == null) {
                if (other.id != null)
                    return false;
            } else if (!id.equals(other.id))
                return false;
            return true;
        }
    

    我觉得可疑的是这句话:

        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
    

    有人能给我解释一下吗?我认为它所做的是检查这个对象的id是否为空,如果另一个对象的id为空,那么方法返回true?

    我觉得有点奇怪?

    3 回复  |  直到 12 年前
        1
  •  1
  •   fge    12 年前

    之后的整个部分 .getClass() 测试可以重写为:

    return id == null ? other.id == null : id.equals(other.id);
    

    也就是说,Eclipse的默认 .equals() 将生成代码,以便如果一个实例字段可以为空,那么如果另一个实例的字段也为空,则它认为相等(至少对于该字段)为真;否则它比较这些值。

    (注意,在以下情况下 id 不为空,但 other.id 是的,这仍然有效,因为 .equals() 合同规定: o , o.equals(null) 为false)

    现在,它可能适合,也可能不适合你的需求;但Eclipse在这里做的事情对我来说似乎是合乎逻辑的。

    除了它生成的代码太长;)

    注意,它要求 身份证件 字段遵循 .equals() 合同

    此外,如果您使用Java 7,代码甚至更短:

    return Objects.equals(id, other.id);
    
        2
  •  1
  •   sanbhat    12 年前

    根据日食 ,如果有2个 Person 对象 id == null ,那么他们是 相同的 。如果它在您的上下文中不起作用,您可以删除它

    您可以用以下代码替换它,以避免相同的情况

    if (id == null || other.id == null) {
           return false;
    }
    
        3
  •  0
  •   Joan    12 年前

    如果 id 两个objec的值相同或两者为空。

    if (id == null) {
            if (other.id != null)
                return false;
    

    此代码检查 身份证件 如果此对象的 身份证件 另一个对象的不同于null返回false

    } else if (!id.equals(other.id))
         return false;
    

    在else中,因为我们知道id不同于null,所以我们可以调用id的方法equals,如果这两个值都为false,则返回false 身份证件 不相等

    如果不满足这些条件,则返回true。