Implementieren von toString auf Java-Enumerationen

Lesezeit: 3 Minuten

Es scheint möglich zu sein, in Java so etwas zu schreiben:

 private enum TrafficLight {
  RED,
  GREEN;

  public String toString() {
   return //what should I return here if I want to return
                               //"abc" when red and "def" when green?
  }
 }

Jetzt würde ich gerne wissen, ob es möglich ist, die toString-Methode “abc” zurückzugeben, wenn der Wert der Aufzählung rot ist, und “def”, wenn er grün ist. Ist es auch möglich, dies in C# zu tun, wo Sie dies tun können?:

 private enum TrafficLight {
  RED = 0,
  GREEN = 15
  ...
 }

Ich habe dies versucht, aber ich erhalte Compiler-Fehler damit.

Vielen Dank

  • Siehe auch stackoverflow.com/questions/1419835/understanding-enums-in-java

    – Markus Elliot

    23. März 2010 um 4:13 Uhr

Benutzer-Avatar
jjnguy

Sie können es wie folgt tun:

private enum TrafficLight {
   // using the constructor defined below
   RED("abc"),
   GREEN("def");

   // Member to hold the name
   private String string;

   // constructor to set the string
   TrafficLight(String name){string = name;}

   // the toString just returns the given name
   @Override
   public String toString() {
       return string;
   }
}

Sie können beliebig viele Methoden und Mitglieder hinzufügen. Ich glaube, Sie können sogar mehrere Konstruktoren hinzufügen. Alle Konstrukteure müssen sein private.

Ein enum in Java ist im Grunde a class die eine festgelegte Anzahl von Instanzen hat.

  • Dies sollte als richtige Antwort markiert werden. Die gewählte Lösung ist überhaupt nicht skalierbar.

    – Erica Kane

    13. April 2016 um 19:43 Uhr

  • @EricaKane, welches ist nicht skalierbar, das “toString with a switch”? Warum ist es nicht skalierbar? Es kompiliert zu tableswitch JVM-Befehl, was bedeutet, dass es keine “Schleife-wenn” über die Schalterfälle gibt – stattdessen wird der Fallwert verwendet, um den nächsten Befehlsversatz zu berechnen. Da Aufzählungen normalerweise nur wenige Werte enthalten, ist die Skalierbarkeit auch selten ein Problem.

    – Vsevolod Golovanov

    30. Mai 2016 um 11:51 Uhr


  • @VsevolodGolovanov Der “toString mit einem Schalter” ist nicht skalierbar, da Sie für jedes Mitglied der Aufzählung einen Fall hinzufügen müssen. Andererseits ist die vorgeschlagene Lösung mit dem Konstruktor viel leistungsfähiger, da es sehr einfach ist, einen benutzerdefinierten Namen anzuzeigen, z TrafficLight(String name, int value) {this.value = value; string = name + "(" + value + ")";}

    – nkatsar

    4. Mai 2017 um 14:33 Uhr

  • Danke @jjnguy für diese Antwort zusammen mit Kommentaren. Jede Aufzählung ist ein Objekt, in dem ich einen Konstruktor definieren kann. Dieser Konstruktor zaubert danach! Hier habe ich mir den Kopf zerbrochen.

    – Vaclav Vlcek

    8. Juli um 23:25 Uhr

Antwort 1:

enum TrafficLight {
  RED,
  GREEN;

  @Override
  public String toString() {
    switch(this) {
      case RED: return "abc";
      case GREEN: return "def";
      default: throw new IllegalArgumentException();
    }
  }
}

Antwort 2:

enum TrafficLight {
  RED(0),
  GREEN(15);

  int value;
  TrafficLight(int value) { this.value = value; }
}

  • Kann auch überschrieben werden toString in jedem Fall, obwohl dies die Anzahl der Klassen erhöht. Und ist wahrscheinlich nicht so sauber, aber gut für verwandte Situationen.

    – Tom Hawtin – Angelleine

    23. März 2010 um 4:50 Uhr


Auch wenn Sie einen Kleinbuchstaben-String-Wert von enum (“rot”, “grün”) erhalten müssen, können Sie dies wie folgt tun:

private enum TrafficLight {
  RED,
  GREEN;

  @Override
  public String toString() {
   return super.toString().toLowerCase();
  }
}

Ich mochte diesen Ansatz für selektives alternatives toString(), wenn es für irgendjemanden da draußen nützlich ist:

private enum TrafficLight {
  RED,
  GREEN {
    @Override
    public String toString() {
        return "GREEN-ISH";
    }
  }
}

1131370cookie-checkImplementieren von toString auf Java-Enumerationen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy