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

时间:2012-02-14 22:15:14

标签: java arraylist constants global final

我正在生成一个对象的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”一样使用它。任何想法???

4 个答案:

答案 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);
    }

}

当您需要带有列表的不可变类时,这很有用。