web-dev-qa-db-fra.com

Déclarer un objet ArrayList comme final pour une utilisation dans un fichier de constantes

Je génère une ArrayList d'objets. Voici le code

ArrayList someArrayList = new ArrayList();

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


someArrayList = eDAO.getLotOfData();

Une fois que j'ai cet objet ArrayList "someArrayList", je voudrais le déclarer public et définitif et le stocker dans un fichier Constants afin qu'il soit accessible globalement. Existe-t-il un moyen de le faire? Si je déclare un objet Arraylist public et final, je ne pourrais pas lui réaffecter de valeurs. J'ai essayé ce qui suit

public final ArrayList anotherArrayList = new ArrayList();

anotherArrayList.addAll(someArrayList);

J'avais espéré stocker cette "anotherArrayList" en tant qu'objet ArrayList global et l'utiliser, mais cela renvoie une exception nullpointer. Je veux l'utiliser comme une constante de chaîne "ConstantsFile.anotherArrayList". Des idées???

30
Raghu

Guava fournit ImmutableList pour à peu près cette raison. (De plus, il n'a pas la surcharge d'espace inutile que ArrayList alloue pour faire de la place pour les éléments futurs que vous n'ajouterez pas pour votre application.)

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

Vous pouvez facilement le faire public static final, mais cela n'empêchera pas les gens de modifier contents.

La meilleure approche consiste à publier en toute sécurité la "constante" en:

  • l'envelopper dans une liste non modifiable
  • utiliser un bloc d'instance pour le remplir

Résultat en une seule déclaration finale soignée avec initialisation:

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

ou, style similaire mais différent pour les éléments simples (qui n'ont pas besoin de code)

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

Compatible avec Java 1.4:

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

Une telle liste n'est pas modifiable, l'appel de méthodes telles que add(), remove() ou set() entraînera UnsupportedOperationException.

Pour les versions moins anciennes Java:

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

Et enfin, Java 9 est livré avec:

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