我有以下类:
public class Sample implements java.io.Serializable{
//POJO with two fields and getters/setters
private String name;
private Integer id;
//This POJO does not override equals() and hashCode()
}
public class B{
private Sample sample;
//here i need override hashcode and equals() based on **sample** property.
}
当我尝试重写B类中的equals()和hashCode()时,我在Eclipse中得到了下面的错误。
字段类型com.mypackage.Sample未实现hashCode()和equals()-生成的代码可能无法正常工作。
现在,我如何根据Sample属性比较两个B实例,无论是否相等?我无法修改Sample类。
你看起来像下面这样吗?试一下吧,从你的问题来看,我认为你也想比较一下你的Sample课程的内容。
class Sample implements java.io.Serializable{
//POJO with two fields and getters/setters
private String name;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
//This POJO does not override equals() and hashCode()
}
public class Beta implements Comparable{
private Sample sample;
public Sample getSample() {
return sample;
}
public void setSample(Sample sample) {
this.sample = sample;
}
@Override
public int compareTo(Object o) {
if(!(o instanceof Beta)){
return -1;
}
}if(((Beta)o).getSample().getName().equals(this.sample.getName())){
return 0; // return true if names are equal
}
if(((Beta)o).getSample().getId().equals(this.sample.getId())){
//if name are notequal and IDs are equal, do what you need to do
}
return -1;
}
public static void main(String[] args) {
Beta b = new Beta();
Sample s = new Sample();
s.setId(10);
s.setName("Name1");
b.setSample(s);
Beta b2 = new Beta();
Sample s2 = new Sample();
s2.setId(20);
s2.setName("Name2");
b2.setSample(s2);
System.out.println(b2.compareTo(b));
Beta b3 = new Beta();
Sample s3 = new Sample();
s3.setId(10);
s3.setName("Name1");
b3.setSample(s3);
System.out.println(b3.compareTo(b));
}
}
覆盖方法
class Sample implements java.io.Serializable{
//POJO with two fields and getters/setters
private String name;
private Integer id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
//This POJO does not override equals() and hashCode()
}
public class Beta /*implements Comparable*/{
private Sample sample;
public Sample getSample() {
return sample;
}
public void setSample(Sample sample) {
this.sample = sample;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Beta other = (Beta) obj;
if ((this.getSample() == null) && (other.getSample() == null)){
return true;
}
if ((this.getSample().getId().equals(other.getSample().getId())) && (this.getSample().getName().equals(other.getSample().getName()))) {
return true;
}
return false;
}
@Override
public int hashCode() {
int hash = 3;
hash = 53 * hash + (this.getSample().getName() != null ? this.getSample().getName().hashCode() : 0);
hash = 53 * hash + (this.getSample().getId() != null ? this.getSample().getId().hashCode() : 0);
return hash;
}
/* @Override
public int compareTo(Object o) {
if(!(o instanceof Beta)){
return -1;
}
if(((Beta)o).getSample().getId().equals(this.sample.getId()) && ((Beta)o).getSample().getName().equals(this.sample.getName())){
return 0;
}
return -1;
}*/
public static void main(String[] args) {
Beta b = new Beta();
Sample s = new Sample();
s.setId(10);
s.setName("Name1");
b.setSample(s);
Beta b2 = new Beta();
Sample s2 = new Sample();
s2.setId(20);
s2.setName("Name2");
b2.setSample(s2);
System.out.println(b2.equals(b));
Beta b3 = new Beta();
Sample s3 = new Sample();
s3.setId(10);
s3.setName("Name1");
b3.setSample(s3);
System.out.println(b3.equals(b));
}
如果不显式重写.equals()
,将仅根据它们的引用对它们进行比较(尽管没有equals()
,但每个对象都从Object
继承一个)。如果您只想在Sample
的基础上比较B
,那么只需执行以下操作:
@Override
public boolean equals(Object o)
{
if (o istanceof B)
{
return sample.equals(o.sample)
}
return false;
}
此外,您应该覆盖hashCode()
(和compareTo()
)以维护equals()
和hashCode()
之间的契约。因此,您还应该具有以下内容:
@Override
public int hashCode()
{
return sample.hashCode();
}
编辑(回应评论):
我的要求是,首先我需要根据"name"检查equals属性Sample的属性。如果名称相等,则两个对象都相等。如果名称不相等,那么我需要根据"ID"检查是否相等Sample的属性。我该怎么做?谢谢
应在Sample
中通过重写equals()
来确定Samples
是否等效。如果Sample
的equals()
基于name
和id
,那么你就没事了。如果您想以不同于正常比较的方式比较B
中的Samples
,那么如果您从Sample
中使用hashCode()
或equals()
,您将无法维护equals()
和hashCode()
之间的B
合同,这意味着您的hashCode()
和equals()
对于B
应该是不可从Sample
调用equals()
或hashCode()
。有关如何基于特定字段进行替代的信息,请参见本教程。