Jaki jest najłatwiejszy i / lub najkrótszy możliwy sposób uzyskania nazw elementów wyliczeniowych w postaci tablicy String
s?
Mam przez to na myśli to, że gdybym na przykład miał następujące wyliczenie:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
public static String[] names() {
// ...
}
}
names()
sposób powróci tablicy { "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }
.
Odpowiedzi:
Oto jedna linijka dla każdej
enum
klasy:Pre Java 8 jest nadal jednolinijkowym, choć mniej eleganckim:
To nazwałbyś tak:
Jeśli potrzebujesz czegoś prostego dla zakodowanej na stałe klasy wyliczeniowej:
źródło
e.getEnumConstants()
ciebie możesz użyćYourEnumName.values()
YourEnumName.values()
jest wywołaniem statycznej metody na klasie, której nie można ponownie wykorzystać dla żadnego wyliczenia. UżywaniegetEnumConstants()
działa dla dowolnej klasy wyliczeniowej. Ideą tej metody jest odtworzenie metody narzędziowej, którą można wywołać jak ostatnią linię odpowiedzi.Class<? extends Enum<?>> e
?Utwórz
String[]
tablicę nazw i wywołajvalues()
metodę statyczną , która zwraca wszystkie wartości wyliczenia, a następnie wykonaj iterację po wartościach i zapełnij tablicę nazw.źródło
values()
13 razy, generując za każdym razem nową tablicę, zamiast buforować tablicę w zmiennej lokalnej? Po co używać metody toString (), która jest zastępowalna, zamiastname()
?name()
do tej pory istniała metoda. jak głupi z mojej strony: P dzięki, że dałeś mi znać :)Oto eleganckie rozwiązanie wykorzystujące Apache Commons Lang 3 :
Mimo że zwraca listę, możesz ją łatwo przekonwertować za pomocą
list.toArray()
źródło
EnumUtils.getEnumList(enumClass)
zwraca wartości wyliczenia, a nie Strings. Możesz użyćEnumUtils.getEnumMap(enumClass).keySet()
, ale kolejność może być inna.Jeśli możesz używać Java 8, działa to ładnie (alternatywa dla sugestii Yury, bardziej wydajna):
źródło
W Javie 8:
źródło
Napisałbym to w ten sposób
źródło
Coś takiego zrobiłoby:
Dokumentacja zaleca używanie
toString()
zamiastname()
w większości przypadków , ale tutaj wyraźnie poprosiłeś o podanie nazwy.źródło
values()
jest wywoływany dwukrotnie, gdy trzeba go wywołać tylko raz.values()
jest to metoda wygenerowana przez kompilator, więc myślę, że jest dość zoptymalizowana. Wreszcie, pamiętam, że czytałem gdzieś, że pętle for-each są bardziej wydajne niż standardowe, inkrementalne pętle for, ale z drugiej strony - to po prostu nie ma znaczenia .for (int i = 0; i < a.length; i++) /* do stuff */;
tym przypadku pętle for-each są w rzeczywistości bardziej wydajne. Szybkie wyszukiwanie SO w tej sprawie daje nam to: stackoverflow.com/questions/2113216/…Inne sposoby:
Pierwszy
Inny sposób
źródło
toString()
działa, ale w ogólnym przypadku nie, ponieważtoString()
można to nadpisać. Służy.name()
do niezawodnego pobierania nazwy instancji w postaci ciągu.Moje rozwiązanie z manipulacją strunami (nie najszybsze, ale zwarte):
źródło
zrobiłbym to w ten sposób (ale prawdopodobnie utworzyłbym nazwy jako niemodyfikowalny zestaw zamiast tablicy):
źródło
names()
metoda jest wywoływana oszczędnie, myślę, że generowanie tablicy na miejscu jest w porządku.Mam taką samą potrzebę i używam metody ogólnej (wewnątrz klasy ArrayUtils):
I po prostu zdefiniuj STATIC wewnątrz wyliczenia ...
Wyliczeniom Java naprawdę brakuje metod names () i get (index), są one naprawdę pomocne.
źródło
zwykły sposób (gra słów zamierzona):
źródło
Zrobiłem mały test na rozwiązaniu @ Bohemian. Wydajność jest lepsza, gdy zamiast tego używa się naiwnej pętli.
źródło
org.apache.commons.lang3.EnumUtils.getEnumMap (State.class) .keySet ()
źródło
EnumUtils
?Jeśli chcesz najkrótszego, możesz spróbować
źródło
vales()
raz)Tylko myśl: może nie musisz tworzyć metody zwracającej wartości wyliczenia jako tablicę ciągów.
Dlaczego potrzebujesz tablicy ciągów? Może będziesz musiał tylko przekonwertować wartości, gdy ich używasz, jeśli kiedykolwiek będziesz musiał to zrobić.
Przykłady:
źródło
Innym sposobem na zrobienie tego w Javie 7 lub wcześniejszej byłoby użycie Guava:
źródło
Spróbuj tego:
źródło
Możesz umieścić wartości wyliczenia na liście ciągów i przekonwertować na tablicę:
źródło
Najłatwiejszy sposób:
Gdzie Kategoria to
Enum
nazwaźródło