Nie możesz Myślę, że masz tutaj CZTERY opcje. Wszystkie cztery oferują rozwiązanie, ale z nieco innym podejściem ...
Opcja pierwsza: użyj wbudowanego name()
wyliczenia. Jest to całkowicie w porządku, jeśli nie potrzebujesz żadnego specjalnego formatu nazewnictwa.
String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration.
Opcja druga: dodaj nadpisujące właściwości do swoich wyliczeń, jeśli chcesz mieć większą kontrolę
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;
}
}
Opcja trzecia: użyj statycznych finałów zamiast wyliczeń:
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() { }
}
Opcja czwarta: interfejsy mają wszystkie pola publiczne, statyczne i końcowe:
public interface Modes {
String MODE_1 = "Fancy Mode 1";
String MODE_2 = "Fancy Mode 2";
String MODE_3 = "Fancy Mode 3";
}
.name()
Patrz: stackoverflow.com/a/6667365/887836Każde wyliczenie ma zarówno metodę name (), jak i valueOf (String). Pierwszy zwraca nazwę wyliczenia, a drugi podaje wartość wyliczenia, której nazwą jest ciąg. Czy to jest to, czego szukasz?
Istnieje również wartość statycznaOf (klasa, łańcuch) na samym Enum, więc możesz również użyć
źródło
some-really-long-string
.valueOf(String)
metody w połączeniu z,toUpperCase(Locale)
aby zapewnić konwersję String.Możesz zastąpić
toString()
metodę dla każdej wartości wyliczenia.Przykład:
Stosowanie:
źródło
Jak wspomina Benny Neugebauer, możesz zastąpić toString (). Zamiast tego nadpisując toString dla każdego pola wyliczeniowego, bardziej podoba mi się coś takiego:
Możesz także dodać metodę statyczną, aby pobrać wszystkie pola, wydrukować je wszystkie itp. Wystarczy wywołać getValue, aby uzyskać ciąg powiązany z każdym elementem Enum
źródło
mode1.name()
lubString.valueOf(mode1)
. Obawiam się, że nie ma nic lepszegoźródło
możesz wykonać połączenie jak poniżej, gdziekolwiek chcesz uzyskać wartość jako ciąg z wyliczenia.
Zwróci „Mode1” jako ciąg znaków.
źródło
Możesz używać,
Mode.mode1.name()
jednak często nie musisz tego robić.źródło
name()
itoString()
mogą zostać zastąpione, ale mam nadzieję, że będzie to jasne po przeczytaniu kodu,enum
jeśli tak się dzieje.name()
jestfinal
. Dziękuję za poprawienie mnie. :)O ile mi wiadomo, jedynym sposobem na uzyskanie nazwy byłoby
Jeśli naprawdę potrzebujesz tego w ten sposób, możesz:
źródło
Mode.mode1
nadal nie jest typuString
.Jeśli chodzi o moje wyliczenia, nie bardzo lubię myśleć, że przydzielono im po 1 Ciąg. W ten sposób implementuję metodę toString () na wyliczeniach.
źródło
return
to zbędne, ponieważ włączanie wyliczeń wszystkich wyliczeń kończy się.Możesz po prostu użyć:
źródło
"" + Modes.mode1
. Naprawiłem odpowiedź''.join()
moje rozwiązanie twojego problemu!
źródło
Enum to tylko trochę wyjątkowa klasa. Wyliczenia mogą przechowywać dodatkowe pola, wdrażać metody itp. Na przykład
Teraz możesz powiedzieć:
System.out.println(Modes.mode1.character())
i zobacz wyjście:
a
źródło
źródło
Ta metoda powinna działać z każdym
enum
:źródło
Wydrukuje:
Ten projekt dla stałych ciągu wyliczeniowego działa w większości przypadków.
źródło
po wielu próbach przyszło mi to rozwiązanie
źródło
Możesz spróbować:
}
źródło
Odkryłem, że ten jest łatwiejszy do uniknięcia błędu typu:
jednak - może to działać, gdy trzeba użyć ciągu znaków w dzienniku / println lub za każdym razem, gdy Java kompiluje metodę toString () automatycznie, ale w wierszu kodu takim jak ten ->
zamiast tego, jak wspomniano powyżej, nadal będziesz musiał rozszerzyć wyliczenie i użyć
.name()
w takich przypadkach:źródło