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

Rag*_*ghu 32 java final global constants arraylist

我正在生成一个对象的ArrayList.以下是代码

ArrayList someArrayList = new ArrayList();

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


someArrayList = eDAO.getLotOfData();
Run Code Online (Sandbox Code Playgroud)

一旦我有了这个ArrayList对象"someArrayList",我想将它声明为public和final,并将其存储在Constants文件中,以便可以全局访问它.有没有办法可以做到这一点?如果我将Arraylist对象声明为public和final,那么我将无法为其重新赋值.我尝试了以下内容

public final ArrayList anotherArrayList = new ArrayList();

anotherArrayList.addAll(someArrayList);
Run Code Online (Sandbox Code Playgroud)

我曾希望将"anotherArrayList"存储为全局ArrayList对象并使用它,但这会返回一个nullpointer异常.我想像String常量"ConstantsFile.anotherArrayList"一样使用它.有任何想法吗???

Boh*_*ian 73

您可以轻松制作public static final,但这不会阻止人们更改内容.

最好的方法是通过以下方式安全地发布 "常量":

  • 将其包装在不可修改的列表中
  • 使用实例块来填充它

导致初始化的一个整洁的最终声明:

public static final List<String> list = Collections.unmodifiableList(
    new ArrayList<String>() {{
        add("foo");
        add("bar");
        // etc
    }});
Run Code Online (Sandbox Code Playgroud)

或者,简单元素的类似但不同的风格(不需要代码)

public static final List<String> list = 
    Collections.unmodifiableList(Arrays.asList("foo", "bar"));
Run Code Online (Sandbox Code Playgroud)

  • 然后删除键入 - 它仍然有效 (3认同)
  • @Raghu有什么大不了的?只需删除`<String>`部分即可! (2认同)

Lou*_*man 25

番石榴提供ImmutableList了这个原因.(此外,它没有ArrayList分配不必要的空间开销,以便为将来为您的应用程序添加的元素腾出空间.)

public static final ImmutableList<String> CONSTANTS = 
  ImmutableList.of("foo", "bar");
Run Code Online (Sandbox Code Playgroud)


Nat*_*tix 21

Java 1.4兼容方式:

public static final List STRINGS = Collections.unmodifiableList(
    Arrays.asList(new String[] {"foo", "bar"}));
Run Code Online (Sandbox Code Playgroud)

这样的列表是不可修改的,调用方法,如add(),remove()set()将引起UnsupportedOperationException.

对于较不古老的Java版本:

public static final List<String> STRINGS = Collections.unmodifiableList(
    Arrays.asList("foo", "bar"));
Run Code Online (Sandbox Code Playgroud)

最后,Java 9附带:

public static final List<String> STRINGS = List.of("foo", "bar");
Run Code Online (Sandbox Code Playgroud)