我想定义一个具有ArrayList作为其参数之一的类。 ArrayList的条目应该是final。根据我的理解,简单地将类的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;
}
}
答案 0 :(得分:0)
ArrayLists总是可变的,如果你希望列表是不可变的,你可以创建自己的列表实现,在构建之后不允许add()
操作,或者只是使用番石榴的ImmutableList。该列表是使用构建器类构建的,一旦构建,就无法修改:
ImmutableList<String> myList = ImmutableList.<String>builder().add("a").add("b").build();
myList.add("c"); //Throws UnsupportedOperationException
另一方面,如果您只希望条目是不可变的,而不是地图本身,那么这取决于您放入列表中的对象。您在代码段中使用的Double
已经是不可变的。但是如果你想让可变对象成为不可变的,你必须将它们包装在一个不允许访问setter方法的包装器中,或者确保返回存储的原始项的副本。