易變性仍時常讓我困惑。是一個包含一組固定可變對象的對象嗎?
如果我有一個對象包含一組固定的可變對象。你認爲這個對象是可變的嗎?
例如: 我有一個叫Puzzle的對象,它包含一組固定的Pieces。碎片是可變的。例如,它們可以向上並且其方向可以改變。假設在這個例子中你不能鬆動棋子(如果在現實生活中這只是真的......),我猜Puzzle對象仍然是不變的,對嗎?
易變性仍時常讓我困惑。是一個包含一組固定可變對象的對象嗎?
如果我有一個對象包含一組固定的可變對象。你認爲這個對象是可變的嗎?
例如: 我有一個叫Puzzle的對象,它包含一組固定的Pieces。碎片是可變的。例如,它們可以向上並且其方向可以改變。假設在這個例子中你不能鬆動棋子(如果在現實生活中這只是真的......),我猜Puzzle對象仍然是不變的,對嗎?
維基百科: 在面向對象和函數式編程中,不可變對象(不可更改對象)是一個對象,其狀態在創建後無法修改。這與可變對象(可變對象)形成對比,可變對象可在創建後進行修改。
在您的示例中,Puzzle對象是可變的,因爲您可以更改其中一個Pieces的狀態。
否。該對象是可變的。具有不變性的一個重要事情是,每次調用該對象作爲參數的(純)函數都會返回相同的值。如果對象包含可變屬性,則情況不會如此。考慮下面這個例子:
一個可變類:
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.
好吧,所以不可變對象不能包含可變對象?涉及某種繼承。因此,不可變性比我想象的要難得多。謝謝! – MWB
正確。如果你希望對象是不可變的,那麼它不能包含可變對象。從技術上講,可以將這些可變對象私有化並封裝它們,以使它們不能被改變,並且你將實現不變性,但這實際上取決於用例。 –