我正在生成一个对象的ArrayList。 以下是代码
ArrayList someArrayList = new ArrayList();
Public ArrayList getLotOfData()
{
ArrayList someData = new ArrayList();
return someData;
}
someArrayList = eDAO.getLotOfData();
一旦我有了这个ArrayList对象“someArrayList”,我想将它声明为public和final并将其存储在Constants文件中,以便可以全局访问它。 有没有办法可以做到这一点?如果我将Arraylist对象声明为public和final,那么我将无法为其重新分配任何值。 我尝试了以下
public final ArrayList anotherArrayList = new ArrayList();
anotherArrayList.addAll(someArrayList);
我原本希望将“anotherArrayList”存储为全局ArrayList对象并使用它,但这会返回一个nullpointer异常。我想像String常量“ConstantsFile.anotherArrayList”一样使用它。任何想法???
答案 0 :(得分:68)
您可以轻松地制作public static final
,但这不会阻止人们更改内容。
最好的方法是通过以下方式安全发布“常量”:
通过初始化产生一个简洁的最终声明:
public static final List<String> list = Collections.unmodifiableList(
new ArrayList<String>() {{
add("foo");
add("bar");
// etc
}});
或类似但不同的简单元素样式(不需要代码)
public static final List<String> list =
Collections.unmodifiableList(Arrays.asList("foo", "bar"));
答案 1 :(得分:23)
Guava提供ImmutableList
。 (此外,它没有ArrayList
分配的不必要的空间开销,以便为将来不会为应用程序添加的元素腾出空间。)
public static final ImmutableList<String> CONSTANTS =
ImmutableList.of("foo", "bar");
答案 2 :(得分:20)
Java 1.4兼容方式:
public static final List STRINGS = Collections.unmodifiableList(
Arrays.asList(new String[] {"foo", "bar"}));
此类列表无法修改,调用add()
,remove()
或set()
等方法会导致UnsupportedOperationException
。
对于较不古老的Java版本:
public static final List<String> STRINGS = Collections.unmodifiableList(
Arrays.asList("foo", "bar"));
最后,Java 9附带:
public static final List<String> STRINGS = List.of("foo", "bar");
答案 3 :(得分:0)
这是创建最终ArrayList并使之不可修改的另一种方法。它涉及创建一个类来保存最终的ArrayList。
首先,列出您的列表,进行所需的所有变异。
第二,创建一个将在其构造函数中创建最终ArrayList的类。
public class Wrapper {
final List<T> list;
// Other final variables to be set and added to the constructor.
public Wrapper(List<T> list) {
this.list = Collections.unmodifiableList(list);
}
}
当您需要带有列表的不可变类时,这很有用。