重写 equals 方法:为什么要使用方法来比较字段
Overriding equals method: why use methods to compare fields
我一直在阅读如何覆盖 equals 方法,并注意到我的书使用方法来比较字段而不是直接比较字段。在阅读了 getters 和 setter 之后,我仍然很难理解为什么在这种情况下会使用 getter。书上定义了一个class,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 而不是直接比较它们?
这取决于你的设计want/need。我发现在直接字段上使用 getter 来实现 equals
的唯一正当理由是因为您正在比较的对象引用可能是由另一个库(如 cglib)生成的代理,并且该字段有一个 null
值,它只能通过 getters 获得。这在使用像 Hibernate 这样的 JPA 实现时是有效的。另一个(非常奇怪的)例子是,如果你传递了这个的子类,并且 getter 内部有自己的业务逻辑。
如果您确定不打算在项目中使用此类库,请使用字段进行比较。
我一直在阅读如何覆盖 equals 方法,并注意到我的书使用方法来比较字段而不是直接比较字段。在阅读了 getters 和 setter 之后,我仍然很难理解为什么在这种情况下会使用 getter。书上定义了一个class,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 而不是直接比较它们?
这取决于你的设计want/need。我发现在直接字段上使用 getter 来实现 equals
的唯一正当理由是因为您正在比较的对象引用可能是由另一个库(如 cglib)生成的代理,并且该字段有一个 null
值,它只能通过 getters 获得。这在使用像 Hibernate 这样的 JPA 实现时是有效的。另一个(非常奇怪的)例子是,如果你传递了这个的子类,并且 getter 内部有自己的业务逻辑。
如果您确定不打算在项目中使用此类库,请使用字段进行比较。