我目前看到了这个:

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;
...
}


然后,当您修改inputinput[0] = "new string"时,内部的arrayOfStrings也被修改了,这破坏了Immutable的特性

相同的逻辑应用于collectionOfString


  此外,我想知道为什么此代码中的参数标记为final?


这是防止将提供的参数重新分配给其他值的保护措施。

08-06 02:11