可变性仍然时常困扰我。
如果我有一个包含一组固定可变对象的对象。你认为这个对象是可变的吗?
实施例: 我有一个名为Puzzle的对象,它包含一组固定的Pieces。这些碎片是可变的。例如,它们可以是upsideDown,其方向可以改变。假设你不能在这个例子中松散碎片(如果在现实生活中只有那些......),我猜拼图对象仍然是不可变的,对吗?
答案 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变成不可变的,有些人会根据需要使这些部分变得不可变。