Was ist der beste Weg, um einen enum
Typ eine Reihe von Zeichenfolgen darstellen zu lassen?
Ich habe es versucht:
enum Strings{
STRING_ONE("ONE"), STRING_TWO("TWO")
}
Wie kann ich sie dann als verwenden Strings
?
Ich weiß nicht, was Sie tun möchten, aber so habe ich Ihren Beispielcode tatsächlich übersetzt ...
package test;
/**
* @author The Elite Gentleman
*
*/
public enum Strings {
STRING_ONE("ONE"),
STRING_TWO("TWO")
;
private final String text;
/**
* @param text
*/
Strings(final String text) {
this.text = text;
}
/* (non-Javadoc)
* @see java.lang.Enum#toString()
*/
@Override
public String toString() {
return text;
}
}
Alternativ können Sie eine Getter-Methode für erstellen text
.
Sie können jetzt tun Strings.STRING_ONE.toString();
private String text
sollte aber endgültig sein.final
würde. Selbst wenn dies nicht erforderlich ist, wäre dies am besten.new
wie der Konstruktorprivate
. Die Objekterstellung ist grundsätzlich verboten undfinal
in diesem Fall nicht unbedingt erforderlich.setText(String)
auf die Aufzählung zu setzen, und das kann die Hölle entfesseln :)final
Art dokumentiert Ihre Absicht, dass es eine Konstante mit Compiler-Unterstützung ist. Wenn SieString
Konstanten verwenden würden, würden Sie dies nicht als deklarierenpublic static String
, oder?Benutzerdefinierte Zeichenfolgenwerte für Enum
von http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
Der Standardzeichenfolgenwert für Java Enum ist der Nennwert oder der Elementname. Sie können den Zeichenfolgenwert jedoch anpassen, indem Sie die toString () -Methode überschreiben. Zum Beispiel,
Wenn Sie den folgenden Testcode ausführen, wird dies erzeugt:
quelle
bin
EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.Klasse , die summieren: Verzeichnis echte schnell. Am besten als erwartete Antwort, indem Sie Werte an den Enum-Konstruktor übergeben. Ich bin eigentlich nicht einverstanden mit dem ÜberschreibentoString()
; Ich glaube, es ist besser, einen expliziten Getter zu verwenden,getKey()
da das ÜberschreibentoString()
von einem anderen Benutzer der Aufzählung unerwartet sein kann.Verwenden Sie seine
name()
Methode:ergibt
ONE
.quelle
Strings.STRING_ONE.name()
ergibt "STRING_ONE", nicht "ONE". Das ist einfach keine gute Antwort. Sie können keine Zeichenfolge haben, die keine gültige Java-Kennung usw. wäre.name()
kann durch ein Verschleierungsprogramm beeinflusst werden. Ich bin vor einiger Zeit auf ein ähnliches Problem gestoßen. Mit Proguard müssen Sie dies beispielsweise umgehen. Siehe Verarbeiten von AufzählungsklassenStellen Sie entweder den Namen der Aufzählung so ein, dass er mit der gewünschten Zeichenfolge übereinstimmt, oder Sie können Ihren Aufzählungswerten im Allgemeinen beliebige Attribute zuordnen:
Es ist wichtig, dass die Konstanten oben und die Methoden / Attribute unten stehen.
quelle
Je nachdem, was Sie unter "Verwenden Sie sie als Zeichenfolgen" verstehen, möchten Sie hier möglicherweise keine Aufzählung verwenden. In den meisten Fällen können Sie sie mit der von The Elite Gentleman vorgeschlagenen Lösung über ihre toString-Methoden verwenden, z. B. in
System.out.println(STRING_ONE)
oderString s = "Hello "+STRING_TWO
. Wenn Sie jedoch wirklich Strings (z. B.STRING_ONE.toLowerCase()
) benötigen , möchten Sie diese möglicherweise lieber als Konstanten definieren:quelle
toLowerCase()
können sie gehen , wenn sie auch meine Lösung wollenStrings.STRING_TWO.toString().toLowerCase()
.interface
anstelle einerfinal
Klasse mitprivate
Konstruktor verwenden. Es ist eine entmutigte Praxis.Sie können das für die Zeichenfolge Enum verwenden
Und Aufruf von der Hauptmethode
quelle
Wenn Sie nicht möchten , verwenden Konstrukteure , und Sie möchten ein haben spezielle Namen für die Methode, versuchen Sie es dieses:
Ich vermute, dass dies die schnellste Lösung ist. Es ist nicht erforderlich, die Variablen final zu verwenden .
quelle
Abrufen und Festlegen von Standardwerten.
quelle