Java等于传递关系

时间:2012-08-02 17:18:40

标签: java equals

我正在尝试根据以下要求实现对象相等:

class MyObject {
  String x;
  String y;
}

1)如果被比较的2个对象上的两个属性都是非空的,那么如果x.equals(x)&& y.equals(y)的

2)如果在被比较的任何对象上至少有一个x为空,那么如果y.equals(y)(假设两个y都是非空的)它们是相等的

3)如果在被比较的任何对象上至少有一个y为空,那么如果x.equals(x)(假设两个x都是非空的)它们是相等的

经过几次尝试后,我开始认为根据这些要求无法实现equals方法的传递关系。欢迎评论! THKS。

3 个答案:

答案 0 :(得分:6)

取这些(x,y)对:

根据规则,(1,2)=(1,null)=(1,3),这会让你相信(1,2)=(1,3),这是假的。所以是的,这是不可能的。

编辑:误读规则,现在修复

答案 1 :(得分:1)

从这三个要求来看,你是对的;你没有传递感。

采取以下示例:

x = "hello", y = "mom"
x = "hello", y = null
x = "hello", y = "world"

按照你的说法,第一个和第二个相等,第二个和第三个相等,但第一个和第三个不相等。

您可能想要的是添加以下限制:1)如果一个x为空,另一个必须与它们相等且2)相同的ys。

答案 2 :(得分:0)

我不确定你的意思是“如果至少有一个y为空”,那么你可能需要进一步澄清这一点,但这里有一个基于我如何理解你的规范的解决方案。

public boolean yourEquals(Object x, Object y) {

    if(x != null && y != null) return x.equals(x) && y.equals(y);
    else if(x == null) return y.equals(y);
    else return x.equals(x);

}

如果我制作了有缺陷的假设,请更正我的假设,但是您对问题的描述在某些地方有点难以理解。

编辑:当然,这种关系不是传递性的。如上所述,与您的要求无关,可以传递。但是这个函数会根据你的三个规则返回一个布尔值。