503 Stimmen

Verwendung von Enum-Werten als String-Literale

Wie lassen sich die in einer Enum gespeicherten Werte am besten als String-Literale verwenden? Zum Beispiel:

public enum Modes {
    some-really-long-string,
    mode1,
    mode2,
    mode3
}

Später könnte ich dann Mode.mode1 um seine String-Repräsentation als mode1 . Ohne ständig anrufen zu müssen Mode.mode1.toString() .

793voto

Michael J. Lee Punkte 12039

Das können Sie nicht. Ich denke, Sie haben hier VIER Möglichkeiten. Alle vier bieten eine Lösung, aber mit einem etwas anderen Ansatz...

Option Eins: verwenden Sie die eingebaute name() auf eine Aufzählung. Dies ist völlig in Ordnung, wenn Sie kein spezielles Benennungsformat benötigen.

    String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration.

Option 2: fügen Sie Ihren Enums überschreibende Eigenschaften hinzu, wenn Sie mehr Kontrolle wünschen

public enum Modes {
    mode1 ("Fancy Mode 1"),
    mode2 ("Fancy Mode 2"),
    mode3 ("Fancy Mode 3");

    private final String name;       

    private Modes(String s) {
        name = s;
    }

    public boolean equalsName(String otherName) {
        // (otherName == null) check is not needed because name.equals(null) returns false 
        return name.equals(otherName);
    }

    public String toString() {
       return this.name;
    }
}

Option Drei: statische Finals anstelle von Enums verwenden:

public final class Modes {

    public static final String MODE_1 = "Fancy Mode 1";
    public static final String MODE_2 = "Fancy Mode 2";
    public static final String MODE_3 = "Fancy Mode 3";

    private Modes() { }
}

Option Vier: Schnittstellen haben alle Felder öffentlich, statisch und endgültig:

public interface Modes {

    String MODE_1 = "Fancy Mode 1";
    String MODE_2 = "Fancy Mode 2";
    String MODE_3 = "Fancy Mode 3";  
}

61 Stimmen

Diese Antwort ist in der Tat falsch: Sie können .name() Siehe: stackoverflow.com/a/6667365/887836

3 Stimmen

@kato2 nicht korrekt. Die Methode .name() wird automatisch vom Compiler erstellt

17 Stimmen

JavaDoc: String java.lang.Enum.name() Gibt den Namen dieser Enum-Konstante zurück, genau wie in der Enum-Deklaration angegeben. Die meisten Programmierer sollten die toString-Methode dieser Methode vorziehen, da die toString-Methode einen benutzerfreundlicheren Namen zurückgeben kann. Diese Methode ist in erster Linie für die Verwendung in speziellen Situationen gedacht, in denen die Korrektheit davon abhängt, den genauen Namen zu erhalten, der sich nicht von Version zu Version ändert. Rückgabe:der Name dieser Enum-Konstante

559voto

Ryan Stewart Punkte 120600

Jede Aufzählung hat sowohl eine name() und eine valueOf(String) Methode. Die erste Methode gibt den String-Namen des Enums zurück, und die zweite Methode liefert den Enum-Wert, dessen Name der String ist. Entspricht dies dem, wonach Sie suchen?

String name = Modes.mode1.name();
Modes mode = Modes.valueOf(name);

Außerdem gibt es eine statische valueOf(Class, String) auf Enum selbst, so dass Sie auch verwenden könnten:

Modes mode = Enum.valueOf(Modes.class, name);

61 Stimmen

DIES sollte eine ANTWORT sein! Die Verwendung von A("A") kann eine Fehlerquelle sein und ist eine sinnlose Zusatzarbeit!

17 Stimmen

@Firzen nicht, wenn der Zeichenfolgenwert Leerzeichen oder Bindestriche enthalten darf, was der Fall ist in some-really-long-string .

0 Stimmen

@ceving Die Frage ist in Bezug auf Leerzeichen und Bindestriche nicht gut formuliert. Die Frage zeigt ein Beispiel mit Bindestrichen, fragt aber nicht danach, wie man eine Enum mit Bindestrichwerten erstellt. Stattdessen wird gefragt, wie man den String-Wert erhält, ohne toString aufrufen zu müssen, ohne dass Bindestrichwerte eine Voraussetzung sind. Abgesehen davon denke ich, dass dies eine bessere Antwort sein könnte, wenn sie geändert würde, um zu erwähnen, dass die Enum-Werte immer noch den Java-Benennungsregeln folgen müssen und etwas verwenden müssten, das in der akzeptierten Antwort erwähnt wird, wenn solche Zeichen erforderlich sind.

102voto

Benny Neugebauer Punkte 45468

Sie können die toString() Methode für jeden Enum-Wert.

Ejemplo:

public enum Country {

  DE {
    @Override
    public String toString() {
      return "Germany";
    }
  },
  IT {
    @Override
    public String toString() {
      return "Italy";
    }
  },
  US {
    @Override
    public String toString() {
      return "United States";
    }
  }

}

Uso:

public static void main(String[] args) {
  System.out.println(Country.DE); // Germany
  System.out.println(Country.IT); // Italy
  System.out.println(Country.US); // United States
}

3 Stimmen

Ich mag das. Es gibt keinen Grund, ein Enum nicht als Klasse mit weiteren Funktionen zu verwenden, z. B. eine Liste aller Werte abrufen, eine Zeichenkette jedes Typs abrufen usw.

17 Stimmen

Hässlich und nicht wiederverwendbar. Viel besser ist es, einen String-Wert als Konstruktor für Country bereitzustellen und dann die toString()-Methode für die Enum zu überschreiben.

0 Stimmen

@Larry sollte dies noch einmal überdenken und sagen, ob die ursprüngliche Frage etwas anderes erforderte. Auch wenn andere Antworten sehr informativ sind, ist dies wohl die einzige Antwort auf die ursprüngliche Frage.

50voto

diegosasw Punkte 10740

Wie Benny Neugebauer erwähnt, können Sie die Funktion toString() überschreiben. Aber anstatt den toString für jedes Enum-Feld zu überschreiben, möchte ich eher etwas wie dies:

public enum Country{
    SPAIN("España"),
    ITALY("Italia"),
    PORTUGAL("Portugal");

    private String value;

    Country(final String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return this.getValue();
    }
}

Sie könnten auch eine statische Methode hinzufügen, um alle Felder abzurufen, sie zu drucken usw. Rufen Sie einfach getValue auf, um die Zeichenkette zu erhalten, die jedem Enum-Element zugeordnet ist

35voto

Sean Patrick Floyd Punkte 283617

mode1.name() o String.valueOf(mode1) . Besser geht's nicht, fürchte ich.

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