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

时间:2016-12-11 12:51:42

标签: java mutability

可变性仍然时常困扰我。

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

实施例: 我有一个名为Puzzle的对象,它包含一组固定的Pieces。这些碎片是可变的。例如,它们可以是upsideDown,其方向可以改变。假设你不能在这个例子中松散碎片(如果在现实生活中只有那些......),我猜拼图对象仍然是不可变的,对吗?

3 个答案:

答案 0 :(得分:3)

来自维基百科: 在面向对象和函数式编程中,不可变对象(不可更改对象)是一个对象,其状态在创建后无法修改。这与可变对象(可变对象)形成对比,可变对象在创建后可以修改。

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

答案 1 :(得分: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. 会返回相同的值。但事实并非如此。

result = rand(100..9999)

答案 2 :(得分:1)

不,如果一个对象包含至少一个可变对象,则该对象不可变。 这些碎片是可变的。因此,拼图不可能是不可改变的。

如果你想让Puzzle变成不可变的,有些人会根据需要使这些部分变得不可变。