覆盖equals方法:为什么使用方法来比较字段

时间:2015-10-10 19:08:32

标签: java equals

我一直在阅读有关如何覆盖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进行比较,而不是直接比较它们?

1 个答案:

答案 0 :(得分:2)

这取决于您想要/需要的设计。我发现在直接字段上使用getter来实现equals的唯一有效原因是因为您要比较的对象引用可能是由另一个库(如cglib)生成的代理,并且该字段具有{{1} }值,它只能通过getter获得。这适用于使用像Hibernate这样的JPA实现时。另一个(非常奇怪的)示例是,如果您传递此类的子类,并且getters在其中有自己的业务逻辑。

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