将 ArrayList 对象声明为最终对象,以便在常量文件中使用

2022-08-31 23:45:04

我正在生成对象的数组列表。以下是代码

ArrayList someArrayList = new ArrayList();

Public ArrayList getLotOfData()
{
ArrayList someData = new ArrayList();
return someData; 
}


someArrayList = eDAO.getLotOfData();

一旦我有了这个ArrayList对象“someArrayList”,我想把它声明为公共和最终的,并将其存储在常量文件中,以便可以全局访问它。有没有办法做到这一点?如果我声明一个Arraylist对象为公共和最终对象,那么我将无法向它重新分配任何值。我尝试了以下方法

public final ArrayList anotherArrayList = new ArrayList();

anotherArrayList.addAll(someArrayList);

我本来希望将此“otherArrayList”存储为全局 ArrayList 对象并使用它,但这会返回一个 nullpointer 异常。我想像字符串常量“ConstantsFile.otherArrayList”一样使用它。任何想法???


答案 1

你可以很容易地做到这一点,但这不会阻止人们改变内容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"));

答案 2

Guava提供ImmutableList就是出于这个原因。(此外,它没有不必要的空间开销,这些空间开销用于为将来的元素腾出空间,而这些元素不会为应用程序添加。ArrayList

public static final ImmutableList<String> CONSTANTS = 
  ImmutableList.of("foo", "bar");

推荐