我目前看到了这个:
public ImmutableClass( final long id, final String[] arrayOfStrings,
final Collection< String > collectionOfString) {
this.id = id;
this.arrayOfStrings = Arrays.copyOf( arrayOfStrings, arrayOfStrings.length );
this.collectionOfString = new ArrayList<>( collectionOfString );
}
我以前从未见过类似的东西。有人认为这是为了 该类的“免疫性”,确保不能从外部修改状态。
那么,这有意义还是这个?
此外,我想知道为什么这段代码中的参数被标记为final?
答案 0 :(得分:3)
那么,这有意义还是这个?
这将生成String数组参数的深层副本。
arrayOfStrings = Arrays.copyOf( arrayOfStrings, arrayOfStrings.length );
这会将输入数组复制到内部变量,这有效地通过修改提供的数组来防止修改ImmutableClass.arrayOfStrings
字段。
如果您只是这样指定:
public ImmutableClass( final long id, final String[] input,
final Collection< String > collectionOfString) {
this.id = id;
this.arrayOfStrings = input;
...
}
然后,当您修改input
:input[0] = "new string"
时,内部arrayOfStrings
也被修改,这打破了Immutable
特征
同样的逻辑应用于collectionOfString
此外,我想知道为什么这段代码中的参数被标记为final?
防止将提供的参数重新分配给其他值是一种保护。