2012-08-09 49 views
9

可能重複:
Why use getters and setters?必要性的getter方法

這是一個新手的問​​題。使用getmethods訪問屬性值非常有必要嗎?一旦賦值,就可以得到值目錄。例如,在下面的代碼中,displayName()可以顯示firstName值,而不需要任何getter方法的幫助。或者它是一個標準的編碼標準,必須具有getter和setter方法或任何其他提供該值的方法?

class Test{ 

    private String firstName; 

    public void setName(String fname){ 
     firstName = fname; 
    } 

    public void displayName() { 
     System.out.println("Your name is " + firstName); 
    } 
}   

回答

12

Tell, Don't Ask是面向對象設計的重要原則。通常你應該告訴物體做事情而不是問問題。因爲鼓勵你進入一個物體並進入田野(或者更糟糕的是進入並在探測器的情況下戳動物),每個地方的吸氣/吸氣裝置都會阻礙這種做法。這破壞了封裝並使你的代碼難以推理。

你的具體情況,我會創建一個名爲Name有一個構造函數取的名字,並顯示其單一方法的對象。

2

請務必使用Getter和Setter來訪問您的屬性!

你應該看看this article...

+3

即使在包私有類和嵌套類的情況下? – Eugene 2012-08-09 12:36:02

+3

這是否也適用於如果你想訪問類內的字段(如他在這個例子中)?我不這麼認爲......這篇文章只談到外部訪問和替代使用公共領域(我同意應該儘量減少)。 – brimborium 2012-08-09 12:36:04

4

你的情況(在顯示名稱)它時並不需要提供消氣。

但是,如果你想使用另一個類的領域,我們需要提供getter方法。

3

getter和setter方法是Java組件和許多框架如Hibernate的標準接口的一部分,期待他們在的地方。這就是說,你當然決定是否以及何時需要它們以及爲了什麼目的。它們提供對私人成員變量的訪問,甚至可以讓你有機會做更多的事情,而不僅僅是簡單的獲取和設置。

面向對象軟件的重點是重用。這意味着其他程序員,或者從現在開始,您可以將代碼用於其他系統。

當你擁有私有成員變量,並使用get/set函數,你可以改變內部實現的功能,而不會破壞所有使用它的其他代碼。

2

擁有私有狀態,封裝好,並在案件很多,這是正確的事情。假設你的班級假設是線程安全的,並且公開的字段不能保證。

另一方面,有些情況下,這是無用的!假設你只在一個包中訪問你的對象,你確定你永遠不會導出它,那麼爲什麼要麻煩?

+1

很確定你可以用'volatile'關鍵字。 – Woot4Moo 2012-08-09 12:37:13

+2

@ Woot4Moo你要確保揮發的唯一的事情是能見度,這是不夠的線程安全 – Eugene 2012-08-09 12:38:45

+1

這似乎不同意:http://stackoverflow.com/questions/7805192/is-a-volatile-int-in -java-thread-safe – Woot4Moo 2012-08-09 12:40:58

2

我沒有任何鏈接來支持這一點,但這是我所做的。

我試圖避免公共領域,如果他們不是靜態的。所以我只是使用受保護和私人領域。從課堂內部,你可以在沒有獲得/設置的情況下訪問它們,這是完全正確的。從課外,總是嘗試使用get/set。

因此,您的示例代碼完全正常對我來說。 :)

編輯:爲我一個人例外是,如果我創建了一個結構狀容器類這樣

class Point4D { 
    public int x1, x2, x3, x4; 
} 

那麼我認爲公共領域是好的。儘管如此,讓它們變得更私密並命名爲吸氣者public int x1()等等會更好。只要有一些方法被引入到這個容器中,它改變了實例的狀態(比如改變x1/x2/x3/x4的值),我將它們設置爲private並添加get/set。