[英]Java “this” in constructors
嗯,這是一個非常基本的問題,我從來沒有用java編寫代碼,但我正在為一個朋友寫一個類......有類似的東西:
class myClass{
private string name;
public string getName() {
return this.name;
}
public void setName (int newValue) {
this.name = newValue;
}
private int number;
public int getNumber() {
return this.number;
}
public void setNumber (int newValue) {
this.number = newValue;
}
}
我想構建構造函數的方式是:
public myClass (string name, int numbers) {
this.name = name;
this.number = number;
}
我的問題:
非常感謝你
name
引用參數,名稱this.name
引用實例字段。 name
和number
字段設為final,因此該類是不可變的。 根據我的經驗,最好從不可變的類定義開始,如果有合法的需要,只能轉向可變的東西。 this
區分實例變量和同名的方法參數變量。 this
選項。 參數使用與字段相同的名稱沒有問題; this.
明確消除歧義,程序將按預期運行。
根據您的程序,使用setter而不是直接寫字段可能有利也可能沒有用。 如果直接在構造函數中編寫值,則可以繞過setter中可能存在的任何運行時檢查,這可能會導致對象保留通常無法保存的數據。 另一方面,如果你的setter試圖用舊值做某事,那么你可能不想調用setter,因為在構造函數中,可能沒有有意義的舊值。 我要說在構造函數中設置字段比使用setter更明顯更好或更糟,只要你小心避免破壞類不變量。
是。 使用this
關鍵字可避免出現問題。
如果get / set方法中有邏輯,那么您應該使用它們。 否則,在構造函數中設置值是有效的。
1)當對象范圍屬性與參數名稱相同時,必須使用this
來區分它們。 當存在名稱沖突時,本地var或參數將優先於該屬性。
出於這個原因,我不希望每個人都有完全相同的名稱,因為它很容易導致錯誤。
2)我也會在構造函數中使用setter,因為如果在設置時需要對參數進行驗證或其他操作,則只需要在一個地方進行更改。 否則它是重復並違反DRY(不要重復自己)原則。
我會做:
public myClass (string name, int number) { setName( name ); setNumber( number ); }
是的, this.
避免問題。 有些人推薦這種方式,比如Rogue Wave在他們的書“ The Elements of Java Style”中 。
其他常見的處理方法是:
名稱成員帶有“m”或“m_”前綴
private string m_name;
private int m_number;
public myClass(string name, int number) {
m_name = name;
m_number = number;
}
將參數稱為不同的名稱,通常是單個字母或成員名稱的縮寫版本
private string name;
private int number;
public myClass(string nam, int num) {
name = nam;
number = num;
}
但我更喜歡你現在使用的是帶有方式this
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.