2012-02-14 12 views
19

Estoy generando una ArrayList de objetos. siguiente es el código deDeclarar un objeto ArrayList como final para su uso en un archivo de constantes

ArrayList someArrayList = new ArrayList(); 

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


someArrayList = eDAO.getLotOfData(); 

Una vez que tengo este objeto ArrayList "someArrayList", me gustaría declarar pública y final y almacenarlo en un archivo Constantes de manera que se puede acceder en todo el mundo. ¿Hay alguna manera de hacerlo? Si declaro que un objeto Arraylist es público y final, no podría reasignarle ningún valor. He intentado lo siguiente

public final ArrayList anotherArrayList = new ArrayList(); 

anotherArrayList.addAll(someArrayList); 

que había esperado para almacenar este "anotherArrayList" como un objeto ArrayList global y usarlo, pero esto devuelve una excepción NullPointer. Quiero usarlo como una constante de cadena "ConstantsFile.anotherArrayList". ¿¿¿Algunas ideas???

+0

Por favor alguien puede editar esta? –

+3

En realidad estás un poco confundido; declarar una variable final significa solo que no puede establecer la referencia a otra cosa, no que no puede agregarle objetos. –

+0

@Dave ... También estoy sorprendido de por qué esto devuelve una excepción nullpointer – Raghu

Respuesta

15

Guava proporciona ImmutableList para casi esta razón. (Además, no tiene la sobrecarga de espacio innecesario que ArrayList asigna para hacer espacio para los elementos futuros que no añadirá para su aplicación.)

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

Puede hacerlo fácilmente public static final, pero eso no impedirá que las personas cambien el contenido .

El mejor enfoque es publicar de forma segura la "constante" por:

  • envolviéndolo en una lista no modificable
  • usando un bloque de instancia para poblarlo

dando como resultado uno clara declaración final con la inicialización:

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

, estilo similar pero diferente de elementos simples (que no necesitan código)

public static final List<String> list = 
    Collections.unmodifiableList(Arrays.asList("foo", "bar")); 
+0

uso Java 1.4 ... así que no puedo usar las colecciones parametrizadas – Raghu

+2

y luego eliminar el tipeo - aún funcionará – Bohemian

+2

@ Raghu ¿Cuál es el problema? ¡Simplemente suelta la parte ''! – adarshr

13

Java 1.4 de manera compatible:

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

Dicha lista es inmodificable, llamar a métodos tales como add(), remove() o set() causará UnsupportedOperationException.

Para las versiones antiguas de Java menos:

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

Y, por último, Java 9 viene con:

public static final List<String> STRINGS = List.of("foo", "bar"); 
Cuestiones relacionadas