Antworten:
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();
final
würde. Selbst wenn dies nicht erforderlich ist, wäre dies am besten.
new
wie der Konstruktor private
. Die Objekterstellung ist grundsätzlich verboten und final
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 Sie String
Konstanten verwenden würden, würden Sie dies nicht als deklarieren public 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,
public enum MyType {
ONE {
public String toString() {
return "this is one";
}
},
TWO {
public String toString() {
return "this is two";
}
}
}
Wenn Sie den folgenden Testcode ausführen, wird dies erzeugt:
public class EnumTest {
public static void main(String[] args) {
System.out.println(MyType.ONE);
System.out.println(MyType.TWO);
}
}
this is one
this is two
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 Überschreiben toString()
; Ich glaube, es ist besser, einen expliziten Getter zu verwenden, getKey()
da das Überschreiben toString()
von einem anderen Benutzer der Aufzählung unerwartet sein kann.
Verwenden Sie seine name()
Methode:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.ONE.name());
}
}
enum Strings {
ONE, TWO, THREE
}
ergibt ONE
.
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ählungsklassen
Stellen 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:
enum Strings {
STRING_ONE("ONE"), STRING_TWO("TWO");
private final String stringValue;
Strings(final String s) { stringValue = s; }
public String toString() { return stringValue; }
// further methods, attributes, etc.
}
Es ist wichtig, dass die Konstanten oben und die Methoden / Attribute unten stehen.
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)
oder String 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:
public interface Strings{
public static final String STRING_ONE = "ONE";
public static final String STRING_TWO = "TWO";
}
toLowerCase()
können sie gehen , wenn sie auch meine Lösung wollen Strings.STRING_TWO.toString().toLowerCase()
.
interface
anstelle einer final
Klasse mit private
Konstruktor verwenden. Es ist eine entmutigte Praxis.
Sie können das für die Zeichenfolge Enum verwenden
public enum EnumTest {
NAME_ONE("Name 1"),
NAME_TWO("Name 2");
private final String name;
/**
* @param name
*/
private EnumTest(final String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Und Aufruf von der Hauptmethode
public class Test {
public static void main (String args[]){
System.out.println(EnumTest.NAME_ONE.getName());
System.out.println(EnumTest.NAME_TWO.getName());
}
}
Wenn Sie nicht möchten , verwenden Konstrukteure , und Sie möchten ein haben spezielle Namen für die Methode, versuchen Sie es dieses:
public enum MyType {
ONE {
public String getDescription() {
return "this is one";
}
},
TWO {
public String getDescription() {
return "this is two";
}
};
public abstract String getDescription();
}
Ich vermute, dass dies die schnellste Lösung ist. Es ist nicht erforderlich, die Variablen final zu verwenden .
private String text
sollte aber endgültig sein.