2012-02-14 15 views
19

Generuję ArrayList obiektów. Poniżej znajduje się kodDeklarowanie obiektu ArrayList jako ostatecznego do użycia w pliku stałych

ArrayList someArrayList = new ArrayList(); 

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


someArrayList = eDAO.getLotOfData(); 

Gdy mam ten ArrayList obiekt „someArrayList”, pragnę oświadczyć, że publiczne i ostateczne i zapisać go w pliku Stałe tak, że może on być dostępny na całym świecie. Czy mogę to zrobić? Jeśli zadeklaruję obiekt Arraylist jako publiczny i ostateczny, wówczas nie będę mógł ponownie przypisać do niego żadnych wartości. Próbowałem następujących

public final ArrayList anotherArrayList = new ArrayList(); 

anotherArrayList.addAll(someArrayList); 

miałem nadzieję, aby zapisać to „anotherArrayList” jako globalnego obiektu ArrayList i używać go, ale zwraca wyjątek NullPointer. Chcę używać go tak jak stałej String "ConstantsFile.anotherArrayList". Jakieś pomysły???

+0

może ktoś proszę zmodyfikować? –

+3

W rzeczywistości jesteś trochę zdezorientowany; deklarowanie zmiennej końcowej oznacza tylko, że nie można ustawić odniesienia do czegoś innego, nie, że nie można dodawać do niej obiektów. –

+0

@Dave ... Jestem również zaskoczony, dlaczego ten zwraca wyjątek nullpointer – Raghu

Odpowiedz

15

Guava zapewnia ImmutableList na prawie tego powodu. (Również, nie ma niepotrzebnego przestrzeń nad głową, że ArrayList przydziela aby zrobić miejsce dla kolejnych elementów, które nie będzie dodanie do aplikacji.)

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

Możesz łatwo zrobić to public static final, ale to nie powstrzyma ludzi przed zmianą treści zawartości.

Najlepszym rozwiązaniem jest bezpiecznie publikować z „stałe” poprzez:

  • owijając go w niemodyfikowalne listy
  • z wykorzystaniem bloku instancji aby wypełnić go

Powstałe w jednym zgrabna deklaracja końcowa z inicjalizacją:

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

lub podobny, ale inny styl dla prostych elementów (które nie potrzebują kod) zgodny

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

Używam Java 1.4 ..... więc nie mogę używać sparametryzowanych kolekcji – Raghu

+2

, a następnie usunąć wpisywanie - nadal będzie działać – Bohemian

+2

@Raghu Co to jest wielka sprawa? Po prostu upuść część ''! – adarshr

13

Java 1.4 sposób:

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

Taka lista jest niezmienne, wywołanie metody takie jak add(), remove() lub set() spowoduje UnsupportedOperationException.

Dla mniej starożytnych wersji Java:

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

I wreszcie, Java 9 pochodzi z:

public static final List<String> STRINGS = List.of("foo", "bar"); 
Powiązane problemy