Saya ingin mencari enum dari nilai stringnya (atau mungkin nilai lainnya). Saya sudah mencoba kode berikut tetapi tidak mengizinkan statis di inisialisasi. Apakah ada cara sederhana?
public enum Verbosity {
BRIEF, NORMAL, FULL;
private static Map<String, Verbosity> stringMap = new HashMap<String, Verbosity>();
private Verbosity() {
stringMap.put(this.toString(), this);
}
public static Verbosity getVerbosity(String key) {
return stringMap.get(key);
}
};
stringMap
inisialisasi). Solusi yang biasa adalah dengan menggunakan kelas bersarang.Jawaban:
Gunakan
valueOf
metode yang secara otomatis dibuat untuk setiap Enum.Untuk nilai arbitrer, mulailah dengan:
Hanya pindah nanti ke implementasi Peta jika profiler Anda memberi tahu Anda.
Saya tahu ini mengulangi semua nilai, tetapi dengan hanya 3 nilai enum, hampir tidak layak dilakukan dengan upaya lain, pada kenyataannya kecuali jika Anda memiliki banyak nilai, saya tidak akan repot dengan Peta, itu akan cukup cepat.
sumber
IllegalArgumentException
bukan mengembalikan nol ( yaitu ketika tidak ada kecocokan ditemukan) - ini adalah bagaimana JDKEnum.valueOf(..)
melakukannya.Anda sudah dekat. Untuk nilai arbitrer, coba sesuatu seperti berikut ini:
sumber
HashMap<>
untuk menyimpan enum yang terbukti lebih dari 40% lebih cepat dari loop foor.dengan Java 8 Anda dapat mencapai dengan cara ini:
sumber
null
. Tapi itu juga tergantung pada kasus penggunaanJawaban @ Lyle agak berbahaya dan saya telah melihatnya tidak bekerja terutama jika Anda membuat enum kelas dalam statis. Sebaliknya saya telah menggunakan sesuatu seperti ini yang akan memuat peta BootstrapSingleton sebelum enum.
Sunting ini seharusnya tidak menjadi masalah lagi dengan JVM modern (JVM 1.6 atau lebih tinggi) tapi saya pikir masih ada masalah dengan JRebel tapi saya belum punya kesempatan untuk menguji ulang .
Muat saya terlebih dahulu:
Sekarang muat di enum constructor:
Jika Anda memiliki enum bagian dalam, Anda bisa mendefinisikan Peta di atas definisi enum dan bahwa (secara teori) harus dimuat sebelumnya.
sumber
Dan Anda tidak dapat menggunakan valueOf () ?
Sunting: Btw, tidak ada yang menghentikan Anda menggunakan statis {} dalam enum.
sumber
valueOf
pada kelas enum, jadi Anda tidak perlu menentukan kelas enumClass
.Jika itu membantu orang lain, opsi yang saya pilih, yang tidak tercantum di sini, menggunakan fungsionalitas Peta Guava :
Dengan default yang dapat Anda gunakan
null
, Anda dapatthrow IllegalArgumentException
atau AndafromString
dapat mengembalikanOptional
, perilaku apa pun yang Anda inginkan.sumber
karena java 8 Anda dapat menginisialisasi peta dalam satu baris dan tanpa blok statis
sumber
Function.identity()
sebelumnya, saya merasa jauh lebih menarik secara tekstual daripadae -> e
.Mungkin, lihat ini. Ini bekerja untuk saya. Tujuan dari ini adalah untuk mencari 'RED' dengan '/ red_color'. Mendeklarasikan
static map
dan memuatenum
s ke dalamnya hanya sekali akan membawa beberapa manfaat kinerja jikaenum
jumlahnya banyak.Silakan masukkan opini Anda.
sumber
Anda dapat mendefinisikan Enum sebagai kode berikut:
Lihat tautan berikut untuk klarifikasi lebih lanjut
sumber
Jika Anda menginginkan nilai default dan tidak ingin membangun peta pencarian, Anda bisa membuat metode statis untuk mengatasinya. Contoh ini juga menangani pencarian di mana nama yang diharapkan akan dimulai dengan angka.
Jika Anda membutuhkannya pada nilai sekunder, Anda hanya perlu membuat peta pencarian terlebih dahulu seperti pada beberapa jawaban lainnya.
sumber
}
sumber
Anda dapat menggunakan
Enum::valueOf()
fungsi seperti yang disarankan oleh Gareth Davis & Brad Mace di atas, tetapi pastikan Anda menanganiIllegalArgumentException
yang akan dibuang jika string yang digunakan tidak ada di enum.sumber