使用final关键字声明List字段
如果我在Synapse
是抽象类型的类中有以下语句:
private final List synapses;
final
是否允许我仍然能够更改List
Synapse
对象的状态,但是阻止我将新的Synapse
对象添加到列表中? 如果我错了,你能否解释一下final
做什么以及何时应该使用关键字final
。
不,final关键字不会使列表或其内容不可变。 如果你想要一个不可变的List,你应该使用:
List unmodifiableList = Collections.unmodifiableList(synapses);
final关键字的作用是阻止您为’synapses’变量赋值。 即,你不能写:
final List synapses = createList(); synapses = createNewList();
但是,您可以写道:
List synapses = createList(); synapses = createNewList();
final
阻止您在分配一次后重新分配 synapses
– 您仍然可以像平常一样添加/删除元素。 您可以在此处详细了解final
关键字。
Java语言规范写道 :
变量可以声明为final。 最终变量只能分配一次。 声明变量final可以作为有用的文档,它的值不会改变,可以帮助避免编程错误。
如果分配了最终变量,那么这是一个编译时错误,除非它在分配之前是明确未分配的(第16段)。
空白最终是一个最终变量,其声明缺少初始化程序。
一旦分配了最终变量,它总是包含相同的值。 如果最终变量包含对对象的引用,则可以通过对对象的操作来更改对象的状态,但该变量将始终引用同一对象。
因此,如果您希望强制通过变量可以访问的状态不会更改,则必须声明变量final
,使用不可修改的List(例如使用Collections.unmodifiableList ),并使Synapse
对象不可变。
您仍然可以更改,添加和删除列表的内容,但无法创建分配给变量的新列表。
最终实现意味着对象引用一旦启动,引用本身就永远不会改变,但内容当然可以。 它根本不违反规则。 您只指定了一个有关参考更改的规则,该规则正在相应地工作。 如果你想要值也应该永远不会改变你应该去不可变列表即
List items = Collections.unmodifiableList(Arrays.asList("a", "b", "c"));
请参阅以下相关问题。
- Java中的最终变量操作