我目前看到了这个:
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 );
}
我以前从未见过这样的东西。有人认为这是为了
Class的“不可变性”,它确保状态不能从外部修改。
那么,这有意义吗?
此外,我想知道为什么此代码中的参数标记为final?
最佳答案
那么,这有意义吗?
这将复制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?
这是防止将提供的参数重新分配给其他值的保护措施。