Apa cara termudah dan / atau sesingkat mungkin untuk mendapatkan nama elemen enum sebagai larik String
s?
Yang saya maksud dengan ini adalah jika, misalnya, saya memiliki enum berikut:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
public static String[] names() {
// ...
}
}
yang names()
metode akan kembali array { "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }
.
Jawaban:
Berikut satu baris untuk semua
enum
kelas:Pre Java 8 masih satu baris, meskipun kurang elegan:
Bahwa Anda akan menelepon seperti ini:
Jika Anda hanya menginginkan sesuatu yang sederhana untuk kelas enum berkode keras:
sumber
e.getEnumConstants()
Anda dapat menggunakanYourEnumName.values()
YourEnumName.values()
memanggil metode statis pada kelas, yang tidak dapat digunakan kembali untuk enum apa pun . MenggunakangetEnumConstants()
karya untuk semua kelas enum. Ide dengan metode ini adalah untuk membuat kembali metode utilitas yang dapat Anda panggil seperti baris terakhir jawaban.Class<? extends Enum<?>> e
?Buat
String[]
larik untuk nama dan panggilvalues()
metode statis yang mengembalikan semua nilai enum, kemudian ulangi nilai dan isi larik nama.sumber
values()
13 kali, menghasilkan array baru setiap kali, alih-alih menyimpan array dalam variabel lokal? Mengapa menggunakan toString (), yang dapat diganti, bukanname()
?name()
metode sampai sekarang. Betapa bodohnya saya: Terima kasih telah memberi tahu saya :)Berikut solusi elegan menggunakan Apache Commons Lang 3 :
Meskipun mengembalikan Daftar, Anda dapat mengonversi daftar dengan mudah dengan
list.toArray()
sumber
EnumUtils.getEnumList(enumClass)
mengembalikan nilai enum, bukan String. Anda bisa menggunakanEnumUtils.getEnumMap(enumClass).keySet()
, tapi urutannya mungkin berbeda.Jika Anda dapat menggunakan Java 8, ini berfungsi dengan baik (alternatif dari saran Yura, lebih efisien):
sumber
Dengan java 8:
sumber
Saya akan menulisnya seperti ini
sumber
Sesuatu seperti ini akan dilakukan:
Dokumentasi merekomendasikan penggunaan
toString()
alih-alihname()
dalam banyak kasus , tetapi Anda secara eksplisit meminta nama di sini.sumber
values()
dipanggil dua kali jika hanya perlu dipanggil sekali.values()
adalah metode yang dihasilkan oleh kompiler, jadi saya rasa itu cukup dioptimalkan. Akhirnya, saya ingat pernah membaca bahwa for-each loop lebih efisien daripada standar, incremental untuk loop, tapi sekali lagi - itu tidak masalah .for (int i = 0; i < a.length; i++) /* do stuff */;
Dalam kasus ini, untuk-masing loop yang , pada kenyataannya, lebih efisien. Pencarian SO cepat tentang masalah ini memberi kita ini: stackoverflow.com/questions/2113216/…Cara lain:
Pertama
Cara lain
sumber
toString()
berhasil, tetapi dalam kasus umum tidak, karenatoString()
dapat diganti. Gunakan.name()
untuk mendapatkan nama instance sebagai String dengan andal .Solusi saya, dengan manipulasi string (bukan yang tercepat, tetapi ringkas):
sumber
saya akan melakukannya dengan cara ini (tetapi saya mungkin akan membuat nama menjadi set yang tidak dapat dimodifikasi daripada array):
sumber
names()
metode ini hanya dipanggil dengan hemat, saya pikir membuat array di tempat itu baik-baik saja.Saya memiliki kebutuhan yang sama dan menggunakan metode generik (di dalam kelas ArrayUtils):
Dan cukup tentukan STATIC di dalam enum ...
Enum Java benar-benar kehilangan metode names () dan get (index), mereka sangat membantu.
sumber
cara biasa (permainan kata-kata):
sumber
Saya melakukan sedikit tes pada solusi @ Bohemian. Performanya akan lebih baik jika menggunakan naive loop.
sumber
org.apache.commons.lang3.EnumUtils.getEnumMap (State.class) .keySet ()
sumber
EnumUtils
?Jika Anda ingin yang terpendek, Anda dapat mencoba
sumber
vales()
sekali)Hanya pemikiran: mungkin Anda tidak perlu membuat metode untuk mengembalikan nilai enum sebagai array string.
Mengapa Anda membutuhkan deretan string? Mungkin Anda hanya perlu mengonversi nilai saat Anda menggunakannya, jika Anda perlu melakukannya.
Contoh:
sumber
Cara lain untuk melakukannya di Java 7 atau sebelumnya adalah dengan menggunakan Jambu Biji:
sumber
Coba ini:
sumber
Anda dapat meletakkan nilai enum ke daftar string dan mengubahnya menjadi array:
sumber
Cara termudah:
Dimana Kategori adalah
Enum
namasumber