Java 重写等于方法:为什么使用方法来比较字段

Java 重写等于方法:为什么使用方法来比较字段,java,equals,Java,Equals,我一直在读关于如何重写equals方法的书,并注意到我的书使用方法来比较字段,而不是直接比较字段。在阅读了关于getter和setter的文章之后,我仍然很难理解为什么在这种情况下会使用getter。本书定义了一个类Employee,如下所示: class Employee { private String lastName; private String firstName; public Employee(String lastName, String first

我一直在读关于如何重写equals方法的书,并注意到我的书使用方法来比较字段,而不是直接比较字段。在阅读了关于getter和setter的文章之后,我仍然很难理解为什么在这种情况下会使用getter。本书定义了一个类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进行比较,而不是直接进行比较?

这取决于您想要/需要的设计。我发现在直接字段上使用getter来实现
equals
的唯一有效原因是,您正在比较的对象引用可能是由另一个库(如cglib)生成的代理,该字段有一个
null
值,并且只能通过getter使用。例如,当使用像Hibernate这样的JPA实现时,这是有效的。另一个(非常奇怪)的例子是,如果您传递了这个类的一个子类,那么getter内部有自己的业务逻辑


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

可能的重复可能只是一种正义感:另一方的隐私似乎是合适的。奇怪的是,一个对象甚至可以改变另一个对象的字段,如果它属于同一个类。你的意思是
if(obj==null)
,而不是
if(this==null)
。我认为既然null不是对象类的成员,equals方法就不喜欢接受它。另一方面,null.equals(object)也抛出了一个异常,所以我也不完全确定该部分发生了什么。