使用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中的最终变量操作