Cra*_*ava 3 java immutability defensive-copy
我有一个关于创建Immutable类的查询.以下是我考虑的要点:
但是我根本不完全理解这一点,你能告诉或给我一个例子,其中5点在这个例子中是清楚的吗?
第5点建议,任何时候你有任何方法可以返回与可变对象有关的东西,你想要创建一个独立于私有状态的副本.例如:
public final class Foo
{
private final List<String> strings;
public Foo(List<String> strings)
{
// Defensive copy on construction. Protects from constructing
// code mutating the list.
this.strings = new ArrayList<String>(strings);
}
public List<String> getStrings()
{
// Defensive copy on read. Protects from clients mutating the list.
return new ArrayList<String>(strings);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,只有在状态可变时才需要防御性复制.例如,如果你使用的ImmutableList
(如番石榴),如上面的类的状态,你需要创建一个建设新的列表(除非输入也是ImmutableList
),但不是在getStrings
.
另请注意,在这种情况下String
是不可变的,因此我们不需要复制每个字符串.如果这是一个List<StringBuilder>
我们需要创建一个新列表和每个元素的新副本作为防御副本的一部分.正如你所看到的,当你所有的状态也是不可变的时候,生活变得更加简单.