重写 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 内部有自己的业务逻辑。

如果您确定不打算在项目中使用此类库,请使用字段进行比较。