我想定义一个以 ArrayList 作为其参数之一的类。 ArrayList 的条目应该是最终的。根据我的理解,简单地将类的 ArrayList 属性声明为“final”并不能实现这一点,因为它只是意味着对此列表的引用是最终的。我如何声明列表中的条目将被视为“最终”?
public class MyClass{
private final ArrayList<Double> classAttributeWithFinalValues; // the entries of the list can still be changed
public MyClass(ArrayList<Double> classAttribute){
this.classAttributeWithFinalValues = classAttribute;
}
}
最佳答案
ArrayList 始终是可变的,如果您希望 list 是不可变的,您可以创建自己的列表实现,该实现在被添加后不允许 add()
操作内置,或者干脆使用 Guava 的 ImmutableList 。该列表是使用构建器类构建的,一旦构建,就无法修改:
ImmutableList<String> myList = ImmutableList.<String>builder().add("a").add("b").build();
myList.add("c"); //Throws UnsupportedOperationException
另一方面,如果您只希望条目不可变,而不是映射本身,那么这取决于您放入列表中的对象。您在代码片段中使用的 Double
已经是不可变的。但是,如果您想让可变对象不可变,则必须将它们包装在不允许访问 setter 方法的包装器中,或者确保返回存储的原始项目的副本。
关于Java ArrayList,最终条目作为类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35130236/