簡體   English   中英

Java“this”在構造函數中

[英]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;
}

我的問題:

  1. 我使用與參數相同的屬性標識符。 做這個。” 避免在這里遇到麻煩?
  2. 是否更好地使用set方法,如果是這樣,我應該使用“this”。

非常感謝你

  1. 是的,它避免了名稱沖突。 在構造函數的上下文中, name引用參數,名稱this.name引用實例字段。
  2. 取決於“更好”的意思。 就個人而言,我會將namenumber字段設為final,因此該類是不可變的。 根據我的經驗,最好從不可變的類定義開始,如果有合法的需要,只能轉向可變的東西。
  1. 是的, this區分實例變量和同名的方法參數變量。
  2. 關於構造函數或setter初始化是否更好的問題一直存在爭論。 如果您只是在第一次創建對象時設置名稱和編號,並且以后不需要更新這些變量,那么僅使用構造函數並省略setter可能會更好。 是的,在setter中,如果您的參數與您要設置的字段具有相同的名稱,則需要使用this選項。

參數使用與字段相同的名稱沒有問題; this. 明確消除歧義,程序將按預期運行。

根據您的程序,使用setter而不是直接寫字段可能有利也可能沒有用。 如果直接在構造函數中編寫值,則可以繞過setter中可能存在的任何運行時檢查,這可能會導致對象保留通常無法保存的數據。 另一方面,如果你的setter試圖用舊值做某事,那么你可能不想調用setter,因為在構造函數中,可能沒有有意義的舊值。 我要說在構造函數中設置字段比使用setter更明顯更好或更糟,只要你小心避免破壞類不變量。

  1. 是。 使用this關鍵字可避免出現問題。

  2. 如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM