2011-01-21 57 views
3

嗯,這是一個非常基本的問題,我從來沒有在Java編碼,但我正在寫一個類的朋友......具有這樣的: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; 
} 

我的問題:

  1. 我使用的是相同標識符的屬性作爲paramete RS。做這個。」在這裏避免任何麻煩?
  2. 是更好地如果是使用一套方法,並且,我應該使用「這一點。」?

非常感謝您

回答

6
  1. 是的,它避免名稱衝突。在構造的背景下,名稱name指參數,該名稱this.name指實例字段。
  2. 取決於你所說的什麼「更好」。就個人而言,我會讓namenumber字段最終,所以這個類是不可變的。根據我的經驗,最好從一個不可變的類定義開始,並且如果有合理的需要,就只能朝着可變的方向前進。
+2

+1建議不可變類以 – Waldheinz 2011-01-21 00:36:22

1

有其使用相同的名稱作爲該領域的參數沒有問題; this.明確地消除歧義,程序將按照預期行事。

根據您的程序可能是也可能不是最好使用制定者,而不是直接寫入領域。如果直接在構造函數中寫入值,那麼可以繞過在setter中可能存在的任何運行時檢查,這可能會導致對象保存它通常不能運行的數據。另一方面,如果您的setter嘗試使用舊值進行操作,那麼您可能不想調用setter,因爲在構造函數中可能沒有有意義的舊值。我想說,在構造函數中設置字段並不比使用setter更好或更糟,只要你小心避免破壞類不變量。

2
  1. 是的,this區分實例變量和同名的方法參數變量。
  2. 有一個在構造函數或setter是否初始化好總是爭論。如果您只是在首次創建對象時設置名稱和編號,並且以後不需要更新這些變量,則只需使用構造函數並省略setter即可。是的,在二傳手中,如果您的參數與要設置的字段名稱相同,則需要使用this
1
  1. 是。使用this關鍵字可避免問題。

  2. 如果有在get/set方法的邏輯,那麼你就應該使用它們。否則,在構造函數中設置值是有效的。

1

1)對象範圍內的屬性是一樣的,你必須使用this區分它們的參數名稱。當名稱發生衝突時,本地var或參數將優先於該屬性。

由於這個原因,我不喜歡每個人都有完全相同的名字,因爲它很容易導致錯誤。

2)我也會在構造函數中使用setter,因爲如果在設置的時候需要對參數進行驗證或其他操作,則只需在一個地方進行更改。否則就是重複,違反了DRY (Don't Repeat Yourself)原則。

我會做:

 
public myClass (string name, int number) { 
    setName(name); 
    setNumber(number); 
} 
0

是,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

+0

開頭我真的不喜歡在字段上使用前綴。您不需要將字段名稱與其類型或範圍混淆。我會選擇第二種方法。 – Alb 2011-01-21 01:05:47