我目前正在研究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;
}
任何和所有帮助将不胜感激。
答案 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
}