List CodeQuality/Guava:清除并填写最终列表或分配新的不可变列表

List CodeQuality/Guava:清除并填写最终列表或分配新的不可变列表,list,immutability,guava,final,List,Immutability,Guava,Final,我有一个类在列表中保存条目,可以通过一个方法不时地清除和重新填充这些条目。 使用普通列表作为类的最终成员被认为是更好的做法,还是应该在每次重新填充时创建一个不可变列表,从而丢失“final”修饰符 我问这个问题的原因是因为其他对象可以从外部访问列表,但不能更改它们。我想向他们返回一个不可变列表,但不是每次调用访问器时都复制它。我实际上不会在这个用例中使用Guava,而只是在JDK中使用工具 您应该在类中使用传统的可变列表实现——可能是ArrayList。但是,类应该实现getList()方法,如

我有一个类在列表中保存条目,可以通过一个方法不时地清除和重新填充这些条目。 使用普通列表作为类的最终成员被认为是更好的做法,还是应该在每次重新填充时创建一个不可变列表,从而丢失“final”修饰符


我问这个问题的原因是因为其他对象可以从外部访问列表,但不能更改它们。我想向他们返回一个不可变列表,但不是每次调用访问器时都复制它。

我实际上不会在这个用例中使用Guava,而只是在JDK中使用工具

您应该在类中使用传统的可变列表实现——可能是ArrayList。但是,类应该实现getList()方法,如下所示

public List<Something> getList() {
  return Collections.unmodifiableList(internalList);
}
public List getList(){
返回集合。不可修改列表(internalList);
}

这将确保其他对象无法修改列表,但可以根据需要修改列表。

Java中的final修饰符不会保护列表本身不被修改。它只是说引用永远不会指向另一个对象,但是引用的对象可以更改

不可变列表是不同的。不可变列表本身无法更改其内容,但您可以将对该列表的引用指向另一个列表,只要它不是最终引用

因此,有一个最终的不可变列表是有意义的。当您不需要可变列表时,我总是使用不可变列表


正如guava的一位主要开发者所说:“你不应该问你是否需要一个不可变的列表。你最好问你是否需要一个可变的列表。”不知道确切的单词。他在youtube上的google开发者频道上说了这句话。

根据列表被修改的频率/列表的大小,我可能会使用一个非最终的
不可变列表
字段。每次列表更改时,您的内部方法将构造一个新的
不可变列表

如果列表经常被修改,或者非常大(因此每次构造一个新列表的成本太高),我会使用带有
集合的可变列表。unmodifiableList()
包装器,正如Louis建议的那样

注意,您可能还想考虑并发访问是否重要(或者使用一个易失性IMPUTABLLIST和某种锁…)。