使用final关键字声明List字段

Q L*_*Liu 15 java final list

如果我在Synapse一个抽象类型的类中有以下语句:

private final List<Synapse> synapses;
Run Code Online (Sandbox Code Playgroud)

是否final允许我仍然能够更改Synapse对象的状态List,但是阻止我将新Synapse对象添加到列表中?如果我错了,你能否解释一下我final在做什么以及什么时候应该使用关键字final.

小智 32

不,final关键字不会使列表或其内容不可变.如果你想要一个不可变的List,你应该使用:

List<Synapse> unmodifiableList = Collections.unmodifiableList(synapses);
Run Code Online (Sandbox Code Playgroud)

final关键字的作用是阻止您为'synapses'变量赋值.即,你不能写:

final List<Synapse> synapses = createList();
synapses = createNewList();
Run Code Online (Sandbox Code Playgroud)

但是,您可以写道:

List<Synapse> synapses = createList();
synapses = createNewList();
Run Code Online (Sandbox Code Playgroud)

  • 值得指出的是,尽管在这样构造的`unmodifiableList`中没有任何东西可以添加,删除或替换,但是列表的元素仍然可以改变它们的状态(如果它们是可变的).关于列表声明或构造的任何内容都无法阻止这种情况. (9认同)

ars*_*jii 6

final在您分配一次之后阻止您重新 synapses分配 - 您仍然可以像平常一样添加/删除元素.您可以在此处详细了解该final关键字.


Kev*_*bin 5

您仍然可以更改、添加和删除列表的内容,但不能创建分配给变量的新列表。