包含一组固定可变对象的对象是否可变?

Is an object that contains a fixed set of mutable objects mutable?

可变性时常让我感到困惑。

如果我有一个包含一组固定可变对象的对象。你认为这个对象是可变的吗?

示例: 我有一个名为 Puzzle 的对象,它包含一组固定的 Pieces。这些片段是可变的。例如,它们可以是倒置的,并且它的方向可以改变。假设你不能在这个例子中松散碎片(如果在现实生活中是这样的话......),我想 Puzzle 对象仍然是不可变的,对吧?

来自维基百科: 在面向对象和函数式编程中,不可变对象(unchangeable object)是指在创建后状态不能被修改的对象。这与可变对象(changeable object)相反,可变对象在创建后就可以修改。

在您的示例中,Puzzle 对象是可变的,因为您可以更改其中一个 Pieces 的状态。

没有。该对象将是可变的。不变性的一个重要方面是,将对象作为参数 return 的(纯)函数每次被调用时都具有相同的值。如果对象包含可变属性,情况就不会如此。考虑这个例子:

一个可变的 class:

class Counter {
    private int count = 0;

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

一个"immutable" class:

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

    public Counter getCounter() { return theCounter; }
}

还有一个看似纯粹的函数,作用于Container:

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

因此,如果 Container 是不可变的,那么如果将相同的 Container 传递给它两次,您会期望 getCount() 会 return 相同的值。但事实并非如此。

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

不,如果一个对象包含至少一个可变对象,则它不能是不可变的。 这里的片段是可变的。所以 Puzzle 不可能是一成不变的。

如果你想让拼图不可变,一些如何根据要求使碎片不可变。