2013-10-02 39 views
2

同時創造不可改變類所有的字段都聲明爲final,這樣他們的價值不能是modified.this是好的,但爲什麼我們還宣佈爲私人爲什麼在創建不可變類時,字段被聲明爲私有?

+1

你知道'私人'的能見度是什麼嗎? –

+0

@Sotirios Delimanolis如果有任何成員是私人的,那麼它不能在課堂以外訪問 – vidyashi

+0

封裝原則規定您儘可能少地暴露於外部世界。 –

回答

3

如果該字段是一個可變對象的引用,使得它final將防止參考反彈到不同的對象。然而,對象仍然可以被修改,實際上是包含對象的側向不變性。

爲了防止這種情況,您可以將字段private(如果他們看不到它,他們不能修改它)。

例如:

public class Order { 
    public final List<OrderLine> order_lines = ...; 
} 

在這裏,任何人都可以進來,並通過添加/刪除/修改訂單行,即使是order_lines修改final的順序。

+0

我認爲這個問題是關於他們爲什麼是'私人',而不是'最後'。 – templatetypedef

+1

>「如果他們不能看到它,他們不能修改它」 - 不正確 –

+0

@SargeBorsch:精心製作。 – NPE

0

不可變的對象在創建後不能更改,但這並不意味着它必須有一個簡單的實現應導出到所有客戶端。例如,採用String類型,該類型使用大量瘋狂的幕後優化來最大化常見情況下的效率(例如,在使用substring時共享支持數組)。通過隱藏類的所有字段,實現可以嘗試利用時間或空間節省的優化,並通過公共接口調解對存儲數據的訪問。如果這些領域是公開的,那麼在事實之後改變實施將是困難的(如果不是不可能的話)。

換句話說,不可變性並不意味着封裝,反之亦然。

希望這會有所幫助!

+0

我是一個新手編程...所以我不能夠了解你的類似的解釋「隱藏類的所有 的領域, 實現可以嘗試的時間或 節省空間的優化 乘虛而入」 可以ü請通過採取另一種基本的例子:(解釋 – vidyashi

0
public class Person{ 
    public Date birthDate = new Date(615666470l); 
} 

然後任何人都可以從外面更新birthDate。

Person porfiriopartida = new Person(); 
porfiriopartida.birthDate=new Date(931199270); 

如果你提供了一個構造函數所需的起始屬性,然後你只允許引用值的工作。

還記得不要返回get方法中的實際對象(至少它們本身是不可改變的)。

相關問題