2015-10-10 32 views
0

我一直在閱讀如何重寫equals方法,並注意到我的書使用方法來比較字段而不是直接比較字段。在閱讀了關於getter和setter的內容之後,我仍然很難理解爲什麼在這種情況下會使用getter。這本書定義了一個類,員工,如下:重寫equals方法:爲什麼使用方法來比較字段

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()與emp.firstName比較this.firstName,而不是直接對它們進行比較?

+4

可能重複[是getter方法調用訪問變量比直接變量訪問類更好](http://stackoverflow.com/questions/23695683/is-getter-method-call-to-access-variable-比直接變量訪問更好) – YoungHobbit

+1

也許只是一種正義的感覺:其他隱私似乎是合適的。奇怪的是,一個對象甚至可以改變另一個對象*的字段,如果它是相同的類。 –

+2

你的意思是'if(obj == null)',而不是'if(this == null)'。 – Andreas

回答

1

這取決於你想要/需要的設計。我發現使用getters over直接字段來實現equals的唯一正當理由是,您正在比較的對象引用可能是由另一個庫(如cglib)生成的代理,並且該字段具有null值,並且只能通過getters 。例如,當使用像Hibernate這樣的JPA實現時,這是有效的。另一個(非常奇怪的)例子是,如果你傳遞了這個子類的一個子類,並且getters擁有自己的業務邏輯。

如果您確定不打算在您的項目中使用此類庫,請使用字段進行比較。

相關問題