2012-03-28 71 views
2

正如你可以看到下面的類聲明2私有實例變量和2得到& 2設置方法與每個私人成員關聯,以允許對它們進行操作和驗證。良好的軟件實踐 - 獲取和設置方法

我的問題是:哪個更適合在構造函數的減速中使用,實例變量直接如下面的代碼片段所示,或者使用與它們相關聯的set方法,以及哪些是在toString中使用的良好軟件實踐方法,實例變量或他們的getter方法?

謝謝你的時間。

public Class Employee { 

    private String firstName; 
    private String lastName; 

    public Employee (String first, String last) 
    { 
    firstName = first; 
    lastName = last; 
    }//end of constructor 

    public void setFirstName(String first) 
    { 
    firstName = first; 
    }//end of method setFirstName 

    public String getFirstName() 
    { 
    return firstName; 
    } 

    public void setLastName(String last) 
    { 
    lastName = last; 
    }//end of method setLastName 

    public String getLastName() 
    { 
    return lastName; 
    }//end of method getLastName 

    public String toString() 
    { 
    return String.format ("%s: %s %s\n", "Employee Name: ", firstName, lastName); 
    }//end of method toString 

}//end of class Employee 

回答

5

我傾向於通過構建來支持初始化。通過使用此方法並提供適當的檢查(編譯時間通過final和運行時通過空檢查或類似),您可以確保您的對象正確並且完全實例化。

在字段上使用final關鍵字將使編譯器檢查您在構建時是否爲該字段賦值。這確實意味着該領域是不可改變的,但令人驚訝的是你需要多久。

我會小心提供一切的getter。如果你不斷提供和使用getter,那就表明你正在從對象中提取數據並在該對象之外操縱它。記住 - 面向對象的一個​​關鍵原則是讓對象爲你做事,而不是要求他們自己做數據。

+1

除此之外,作爲一個經驗法則,在構造函數中使用可重寫的方法是不鼓勵的,因爲它使代碼完全無法維護(至少在我遇到過的情況下)。 – fjdumont 2012-03-28 14:59:09

+0

謝謝布賴恩的時間和解釋。這是有幫助的。 – Sinan 2012-03-28 15:03:09

1

如果你希望你的類進行擴展(和的getter/setter覆蓋),最好是使用的方法,而不是變量。

注意:我不確定在構造函數中發生了什麼,您可能更適合直接設置變量。

您可以將getter/setter標記爲final,然後您不必擔心覆蓋。仍然是一個很好的做法,使用這些方法,而不是直接訪問,因爲您可以更容易地在那裏放置斷點或調試語句

+0

謝謝Attila的回答!可能會向您提出另一個問題 - 就字符串驗證而言 - 您從中體驗到了什麼是您在驗證代碼中驗證字符串的過程中所要做的事情!再次感謝你。 – Sinan 2012-03-28 14:58:04

+0

你想要驗證什麼?順便說一句,你可能會更好地發佈這個作爲一個新的問題,更精細的解釋你想要實現什麼 – Attila 2012-03-28 15:10:16

+0

謝謝我今天晚些時候可以做到這一點! – Sinan 2012-03-28 15:14:13

2

規則1,總是限制訪問所需最低限度的,即除非你明確需要修改第一/姓氏的值,使對象不可變的(構造函數的參數,沒有制定者只干將)

+0

好的規則,但我會說這是除了在這種情況下的點。 – claesv 2012-03-28 15:00:35

0

我會使用setter。有時你在setters中有額外的代碼。例如,列表的setter可能會掛鉤列表的Changed事件,並且通過不使用setter,您將不會捕獲Changed事件。

1

一般來說,我傾向於避免從構造函數中調用非靜態方法(因爲對象在該階段未完全初始化)。如果setter方法只將字段設置爲參數值,就像上面那樣,我只是將它設置在構造函數中(即不調用setter)。如果setter更復雜,我會嘗試將邏輯分解爲靜態輔助方法,並從構造函數和setter方法中使用它。例如:

int field_;  

Constructor(int initialValue) { 
    field_ = helper(initialValue); 
} 

public void setField(int value) { 
    field_ = helper(value); 
} 

// not really complex, but avoid duplication of logic 
private static int helper(int value) { 
    return 2*value; 
} 
+0

謝謝Claesv。 – Sinan 2012-03-28 15:05:11