2012-02-14 90 views
19

我正在生成一个对象的ArrayList。 以下是代码声明一个ArrayList对象作为final在常量文件中使用

ArrayList someArrayList = new ArrayList(); 

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


someArrayList = eDAO.getLotOfData(); 

一旦我有这个ArrayList对象“someArrayList”,我想声明一下公众和最终并将其存储在一个常量文件,以便它可以在全球范围内访问。 有没有一种方法可以做到这一点?如果我宣布Arraylist对象是public和final,那么我将无法为其重新分配任何值。 我尝试以下

public final ArrayList anotherArrayList = new ArrayList(); 

anotherArrayList.addAll(someArrayList); 

我曾希望存储这个“anotherArrayList”作为一个全球性的ArrayList对象,并使用它,但是这会返回一个空指针异常。我想使用它就像一个字符串常量“ConstantsFile.anotherArrayList”。有任何想法吗???

+0

有人可以修改吗? – 2012-02-14 22:23:15

+3

你实际上有点困惑;声明一个变量final只意味着你不能将引用设置为别的,而不是你不能添加对象。 – 2012-02-14 22:27:08

+0

@Dave ...我也很惊讶,为什么这会返回一个空指针异常 – Raghu 2012-02-14 22:28:35

回答

15

Guava只是这个原因提供ImmutableList。 (另外,它没有多余的空间开销ArrayList分配,以腾出空间,你不会再增加了您的应用程序的未来元素。)

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

你可以很容易地使它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")); 
    
  • +0

    我使用Java 1.4 .....所以不能使用参数化集合 – Raghu 2012-02-14 22:29:40

    +2

    然后删除键入 - 它仍然可以工作 – Bohemian 2012-02-14 22:30:40

    +2

    @Raghu有什么大不了的?只要放下''部分! – adarshr 2012-02-14 22:31:11

    13

    的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"); 
    
    相关问题