2012-10-26 34 views
8

如果我有一个类,其中​​是一个抽象类中声明如下:声明列表场final关键字

private final List<Synapse> synapses; 

是否final让我仍然能够改变​​对象的状态在List,但阻止我添加新的​​对象到列表中?如果我错了,能否请您解释一下final正在做什么以及何时应该使用关键字final来代替。

回答

20

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

List<Synapse> unmodifiableList = Collections.unmodifiableList(synapses); 

什么final关键字的作用是防止你分配一个新值“突触”的变量。即,你不能写:

final List<Synapse> synapses = createList(); 
synapses = createNewList(); 

你可以,但是,写:

List<Synapse> synapses = createList(); 
synapses = createNewList(); 
+7

值得指出的是,虽然没有什么可以添加,删除或'unmodifiableList'构建这样的替换,列表的元素仍然可以有自己的状态(如果他们是变)。列表声明或构造的任何内容都不能阻止这一点。 –

+0

所以你可以这样做:'最终列表 synapses = createList();'然后做'synapses.add(newSynapse())'?那么这意味着“突触”不能指向其他任何东西,但这个列表是正确的? –

+0

@ A.Vieira是的,对,只要'synapses'是像ArrayList这样的可变对象。 –

4

final阻止您从重新指定synapses指定了一次后 - 仍然可以像平常一样添加/移除元素。您可以阅读关于final关键字here的更多信息。

2

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

2

Java语言规范writes

变量可以被声明为final。最终变量只能分配一次。声明一个变量final可以作为有用的文档,它的值不会改变,并且可以帮助避免编程错误。

如果最后一个变量被分配给它,那么这是一个编译时错误,除非它在赋值之前立即未赋值(第16章)。

一个空白的final是一个最终变量,其声明缺少一个初始化器。

一旦分配了最终变量,它总是包含相同的值。如果一个最终变量持有一个对象的引用,那么该对象的状态可以通过对该对象的操作来改变,但该变量将始终引用相同的对象。

因此,如果您想强制,国家通过了可变可达不会改变,你必须声明变量final,使用可修改的列表(例如用Collections.unmodifiableList),使​​对象不变。

1

最终实现意味着对象引用一旦启动,引用本身永远不能改变,但内容当然可以。它根本不违反规则。您只针对参考更改指定了一条相应的规则。如果你想要的值也永远不会改变你应该去为不变的名单我。e

List<String> items = Collections.unmodifiableList(Arrays.asList("a", "b", "c")); 

请参阅以下相关问题。