基本的java equals()覆盖了所需的帮助

时间:2011-11-23 13:14:17

标签: java equals override

我目前正在研究java中的简单行程序。将没有实际的GUI,因此它完全基于文本。

我们需要有一个点类和一个包含点对象的线类。

我遇到的问题是涉及我的点类的equals方法。考虑到每个点只有两个POSITIVE int值,一个x和ay,我在这里遇到问题,我担心当我必须比较线时会遇到问题,这将涉及比较点,int宽度和字符串颜色。

这是我的点类的equals方法的代码。

@Override
public boolean equals(Point that) {
    if(this==that)
        return true;
    //if
    if(this.x==that.getX() && this.y==that.getY())
        return true;
    return false;
}

任何和所有帮助将不胜感激。

6 个答案:

答案 0 :(得分:4)

签名需要包含Object,而不是Point。然后,您需要进行明显的检查,以确保该对象实际上是一个点,并且它是非空的。

除此之外,正如你已经把它放在那里我没有看到该方法的任何问题,它是反射的,对称的,一致的和传递的,据我所知。如果你的班级使用了双打,那么我会说在比较它们时加上一个delta值 - 但显然有一些不是问题的整数。

间接问题是你真的应该覆盖哈希码以便以相同的方式运行,否则当你将你的点添加到使用hashcode()的集合(通过契约他们')时你会遇到奇怪的问题我希望以相同的方式比较对象。)

答案 1 :(得分:1)

对于只包含两个整数的简单类,以下hashCode和equals方法是合适的:

/*
 * (non-Javadoc)
 * 
 * @see java.lang.Object#hashCode()
 */
@Override
public int hashCode()
{
    final int prime = 31;
    int result = 1;
    result = prime * result + x;
    result = prime * result + y;
    return result;
}

/*
 * (non-Javadoc)
 * 
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object obj)
{
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Point other = (Point) obj;
    if (x != other.x)
        return false;
    if (y != other.y)
        return false;
    return true;
}

答案 2 :(得分:0)

你展示了Line class equals方法,但我不认为Line可以等于Point。行可以包含一个Point。你的意思是Point equals方法吗?

答案 3 :(得分:0)

您的问题似乎与性能和Object.equals()方法有关。你应该读这个:

http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29

您的类应该覆盖hashCode()方法。

答案 4 :(得分:0)

查看Object.equals()方法的定义。特别要看一下参数的类型。任何重写equals()必须都有一个Object参数。

public boolean equals(Object that) { ... }

答案 5 :(得分:0)

让我试一试:

@Override
public boolean equals(Object o) 
{
    //Cast the object o to Point instance
    if(!(o instanceof Point))
        return false;
    Point obj = (Point)o;
    if(obj==null)
        return false;//Checking if null
    else if.....//test properties using cast object obj
}