包含一组固定可变对象的对象是否可变?
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 不可能是一成不变的。
如果你想让拼图不可变,一些如何根据要求使碎片不可变。
可变性时常让我感到困惑。
如果我有一个包含一组固定可变对象的对象。你认为这个对象是可变的吗?
示例: 我有一个名为 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 不可能是一成不变的。
如果你想让拼图不可变,一些如何根据要求使碎片不可变。