2016-12-11 96 views
0

易變性仍時常讓我困惑。是一個包含一組固定可變對象的對象嗎?

如果我有一個對象包含一組固定的可變對象。你認爲這個對象是可變的嗎?

例如: 我有一個叫Puzzle的對象,它包含一組固定的Pieces。碎片是可變的。例如,它們可以向上並且其方向可以改變。假設在這個例子中你不能鬆動棋子(如果在現實生活中這只是真的......),我猜Puzzle對象仍然是不變的,對嗎?

回答

3

維基百科: 在面向對象和函數式編程中,不可變對象(不可更改對象)是一個對象,其狀態在創建後無法修改。這與可變對象(可變對象)形成對比,可變對象可在創建後進行修改。

在您的示例中,Puzzle對象是可變的,因爲您可以更改其中一個Pieces的狀態。

+0

好吧,所以不可變對象不能包含可變對象?涉及某種繼承。因此,不可變性比我想象的要難得多。謝謝! – MWB

+0

正確。如果你希望對象是不可變的,那麼它不能包含可變對象。從技術上講,可以將這些可變對象私有化並封裝它們,以使它們不能被改變,並且你將實現不變性,但這實際上取決於用例。 –

1

否。該對象是可變的。具有不變性的一個重要事情是,每次調用該對象作爲參數的(純)函數都會返回相同的值。如果對象包含可變屬性,則情況不會如此。考慮下面這個例子:

一個可變類:

class Counter { 
    private int count = 0; 

    public int getCount() { 
     return count++; 
    } 
} 

的 「不可改變的」 類:

class Container { 
    private final Counter theCounter = new Counter(); 

    public Counter getCounter() { return theCounter; } 
} 

這在Container工作看似純函數:

public int getCount(Container container) { 
    return container.getCounter().getCount(); 
} 

所以,如果Container是不可變的,你會期望getCount()將返回相同的值,如果相同的Container傳遞給它兩次。但這種情況並非如此。

Container container = new Container(); 
getCount(container); // Returns 0. 
getCount(container); // Returns 1. 
0

不,如果對象包含至少一個可變對象,則該對象不可變。 這裏的作品是可變的。所以拼圖不可能是不可改變的。

如果你想使拼圖不可變,那麼一些如何根據需求使拼圖不可變。

+0

在我的例子中,我認爲讓作品不可變是不容易的。玩家必須能夠旋轉這些棋子。 – MWB

+0

而不是改變實際的一塊,你可以有一個函數'旋轉',返回一個旋轉的新件。永遠有辦法讓一個類不可變。 – marstran

+0

我猜...但不知何故,我的直覺認爲這不是正確的路要走。也許我太依附於實際的拼圖,當你旋轉一塊時,你不會去創建新的棋子。所以我想你的後續問題:是的,這是可能的,但你會嗎? – MWB

相關問題