web-dev-qa-db-fra.com

Comment stocker un tableau constant de chaîne en Java

Je choisis au hasard parmi un ensemble de chaînes particulières dans mon application. Je stocke ces données directement dans le code. Autant que je sache, vous ne pouvez pas déclarer public static final String[] = {"aa", "bb"}. Donc, je pense que l'énumération serait utile, ce qui fonctionne bien avec les noms d'un mot:

public enum NAMES {
  Mike, Peter, Tom, Andy
}

Mais comment puis-je stocker des phrases comme celle-ci? Ici, l'énumération échoue:

public enum SECRETS {
  "George Tupou V, the King of Tonga, dies in Hong Kong at the age of 63.",
  "Joachim Gauck is elected President of Germany.",
  "Lindsey Vonn and Marcel Hirscher win the Alpine Skiing World Cup.";
}

Quoi d'autre devrais-je utiliser? Ou est-ce que j'utilise mal l'énumération?

10
tsusanka
public enum Secret
{
    TONGA("George Tupou V, the King of Tonga, dies in Hong Kong at the age of 63."), 
    GERMANY("Joachim Gauck is elected President of Germany."),
    SKIING("Lindsey Vonn and Marcel Hirscher win the Alpine Skiing World Cup.");

    private final String message;

    private Secret(String message)
    {
        this.message = message;
    }

    public String getMessage()
    {
        return this.message;
    }
}
5
Matt Ball

Tu peux faire

public static final String[] = {"aa", "bb"};

il vous suffit de spécifier le nom du champ:

public static final String[] STRINGS = {"aa", "bb"};

EDIT: J'appuie la réponse de Jon Skeet selon laquelle il s'agit d'une mauvaise pratique du code. Tout le monde peut alors modifier le contenu de votre tableau. Ce que vous pouvez faire est de le déclarer privé et de spécifier un getter pour le tableau. Vous préserverez l'accès aux index et empêcherez les écritures accidentelles:

private static final String[] STRINGS = {"aa", "bb"};

public static String getString(int index){
    return STRINGS[index];
}

Je suppose que vous auriez également besoin d'une méthode pour obtenir la longueur du tableau:

public static int stringCount(){
    return STRINGS.length;
}

Mais tant que votre projet est petit et que vous savez ce que vous faites, tout ira bien si vous le laissez public.

20
Jakub Zaverka

Vous ne pouvez pas créer un tableau immuable, fondamentalement. Le plus proche que vous puissiez faire est de créer une collection immuable, par exemple. avec goyave .

public static final ImmutableList<String> SECRETS = ImmutableList.of(
    "George Tupou V, the King of Tonga, dies in Hong Kong at the age of 63.", 
    "Joachim Gauck is elected President of Germany.",
    "Lindsey Vonn and Marcel Hirscher win the Alpine Skiing World Cup.");

Vous pourriez utilisez une enum en donnant à chaque valeur enum une chaîne associée, comme ceci:

public enum Secret {
    SECRET_0("George..."),
    SECRET_1("Joachim..."),
    SECRET_2("Lindsey...");

    private final String text;

    private Secret(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

... mais si vous seulement voulez les chaînes comme une collection, j'utiliserais la liste immuable. Les énumérations sont géniales lorsqu'elles sont appropriées , mais rien n'indique qu'elles soient vraiment appropriées dans ce cas.

EDIT: Comme indiqué dans une autre réponse, ceci est parfaitement valide:

public static final String[] FOO = {"aa", "bb"};

... en supposant que ce n'est pas dans une classe intérieure (que vous n'avez mentionnée nulle part dans votre question). Cependant, c'est un très mauvaise idée car les tableaux sont toujours mutables. Ce n'est pas un tableau "constant"; le référence ne peut pas être changé, mais un autre code pourrait écrire:

WhateverYourTypeIs.FOO[0] = "some other value";

... ce que je suppose que vous ne voulez pas.

6
Jon Skeet
public enum NAMES {

  Mike("Mike Smith"),
  Peter("Peter Jones"),
  Tom("Thomas White"),
  Andy("Andrew Chu");

  private final String fullname;

  private NAMES(String value)
  {
    fullname = value;
  }
};
0
Thomas

Insérez les phrases sélectionnées dans un Set<String>, puis utilisez la valeur de retour de Collections.unmodifiableSet(). Exemple:

final Set<String> mutableSentences = new HashSet<>();
/* ... */
final Set<String> sentences = Collections.unmodifiableSet(mutableSentences);
0
nicobn