java--为什么要复制类的免疫性参数?

时间:2018-06-03 13:16:30

标签: java class object constructor immutability

我目前看到了这个:

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?

1 个答案:

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

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

同样的逻辑应用于collectionOfString

  

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

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