2016-09-23 79 views
0

我在閱讀有關天氣的文章,或者從這個SO page的構造函數中調用setter是一個好習慣。我知道你不應該從構造函數中調用非final方法。其中一個答案建議:麻煩理解「泄漏該參考文獻」

在實例 完全初始化之前,構造函數應該謹慎地泄漏這個。

我不完全明白上面引用的意思。假設我有下面的類:

public final class Employee 
{ 
    private String empID; 
    private String empFirstName; 
    private String empLastName; 

    public Employee(String ID, String FirstName, String LastName) 
    { 
     //Call to other setters left out. 
     this.setEmployeeLastName(LastName); 

    } 

    //empID, empFirstName setter left out. 
    public void setEmployeeLastName(String lastname) 
    { 
     this.empLastName = lastname; 
    } 
} 
  1. 只是作爲一個例子,我怎麼會泄露完全建立的情況下在此之前的參考?它是否意味着在之前將對象作爲參數創建?
+0

請注意,因爲你的類是最終的,所有的方法都是隱式的最終,所以你不需要在這種情況下聲明你的方法setEmployeeLastName final –

+0

@Gimby - 好的建議,現在編輯。 – AnnabelleRosemond

回答

1

泄漏this引用可能是危險的,因爲事情看起來像他們應該被完全初始化可能不是,這實際上可以很容易地隱藏。下面是它是如何使用問題的子類例子:實例的Bar一個新的實例時,它會顯示1

class Foo{ 
    Foo(){ 
     doStuff(); 
    } 
    void doStuff(){} 
} 

class Bar extends Foo{ 
    private int i = 1; 
    @Override 
    public void doStuff(){ 
     System.out.println(i); 
    } 
} 

你會覺得,。但相反,它顯示0,因爲該方法在Bar的構造函數運行之前被調用,所以i尚未設置其值。這是一個例子,說明泄漏的代碼在其他方面看起來不錯的情況下可能會適得其反。

對於第二個問題,調用finalprivate方法幾乎總是在構造函數中有效。唯一的例外是,如果您調用一個依賴某個值被初始化的方法,並且在該初始化發生之前調用該方法。但是你的setter不依賴於任何狀態,所以情況並非如此,並且它不能在子類中修改(因爲它是最終的),所以沒有辦法讓它行爲不當。