14 Stimmen

Wie speichert man ein konstantes Array von Strings in Java?

Ich wähle nach dem Zufallsprinzip aus einer Reihe von bestimmten Zeichenfolgen in meiner Anwendung. Ich speichere diese Daten direkt im Code. Soweit ich weiß, können Sie nicht deklarieren public static final String[] = {"aa", "bb"} . Daher dachte ich, dass die Aufzählung nützlich sein würde, die mit Ein-Wort-Namen gut funktioniert:

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

Aber wie speichere ich Sätze wie diesen? Hier versagt die Aufzählung:

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.";
}

Was sollte ich noch verwenden? Oder verwende ich die Aufzählung falsch?

25voto

Jakub Zaverka Punkte 8654

Das können Sie tun

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

müssen Sie nur den Namen des Feldes angeben:

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

EDIT: Ich schließe mich der Antwort von Jon Skeet an, dass dies eine schlechte Codepraxis ist. Jeder kann dann den Inhalt Ihres Arrays ändern. Was Sie tun können, ist, es als privat zu deklarieren und einen Getter für das Array anzugeben. So bleibt der Index-Zugriff erhalten und versehentliche Schreibzugriffe werden verhindert:

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

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

Ich vermute, dass Sie eine Methode benötigen, um auch die Länge des Arrays zu ermitteln:

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

Aber solange Ihr Projekt klein ist und Sie wissen, was Sie tun, ist es völlig in Ordnung, es einfach öffentlich zu machen.

7voto

Jon Skeet Punkte 1325502

Man kann im Grunde kein unveränderliches Array erstellen. Am ehesten kann man eine unveränderliche Sammlung erstellen, z.B. mit Guave .

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.");

Sie könnte einen enum indem Sie jedem Aufzählungswert eine zugehörige Zeichenkette zuordnen, etwa so:

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;
    }
}

... aber wenn Sie nur wollen die Zeichenfolgen als eine Sammlung, würde ich die unveränderliche Liste verwenden. Enums sind großartig wenn sie angebracht sind aber es gibt keinen Hinweis darauf, dass sie in diesem Fall wirklich angebracht sind.

EDIT: Wie in einer anderen Antwort erwähnt, ist dies est vollkommen gültig:

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

... vorausgesetzt, es ist nicht in einer inneren Klasse (die Sie nirgends in Ihrer Frage erwähnt haben). Wie auch immer, es ist eine sehr schlechte Idee da Arrays immer veränderbar sind. Es handelt sich nicht um ein "konstantes" Array; die Referenz kann nicht geändert werden, aber anderer Code könnte geschrieben werden:

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

... und ich vermute, dass Sie das nicht wollen.

6voto

Matt Ball Punkte 343109
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;
    }
}

0voto

Thomas Punkte 5074
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;
  }
};

0voto

nicobn Punkte 44

Fügen Sie die ausgewählten Sätze in eine Set<String> und verwenden dann den Rückgabewert von Collections.unmodifiableSet() . Beispiel:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X