我一直在阅读有关如何覆盖equals方法的信息,并注意到我的书使用方法比较字段而不是直接比较字段。在阅读了关于吸气剂和制定者之后,我仍然很难理解为什么在这种情况下会使用吸气剂。本书定义了一个类Employee,如下所示:
class Employee {
private String lastName;
private String firstName;
public Employee(String lastName, String firstName){
this.lastName = lastName;
this.firstName = firstName;
}
public String getLastName(){
return lastName;
}
public String getFirstName(){
return firstName;
}
public boolean equals(Object obj){
if(this == obj)
return true;
if(this == null)
return false;
if(this.getClass() != obj.getClass())
return false;
Employee emp = (Employee) obj;
return
this.firstName.equals(emp.getFirstName())
&& this.lastName.equals(emp.getLastName());
}
}
是否有理由使用方法getFirstName()将this.firstName与emp.firstName进行比较,而不是直接比较它们?
答案 0 :(得分:2)
这取决于您想要/需要的设计。我发现在直接字段上使用getter来实现equals
的唯一有效原因是因为您要比较的对象引用可能是由另一个库(如cglib)生成的代理,并且该字段具有{{1} }值,它只能通过getter获得。这适用于使用像Hibernate这样的JPA实现时。另一个(非常奇怪的)示例是,如果您传递此类的子类,并且getters在其中有自己的业务逻辑。
如果您确定不打算在项目中使用此类库,请使用字段进行比较。