Apa cara terbaik untuk memiliki enum
tipe mewakili serangkaian string?
Saya mencoba ini:
enum Strings{
STRING_ONE("ONE"), STRING_TWO("TWO")
}
Bagaimana saya bisa menggunakannya sebagai Strings
?
Saya tidak tahu apa yang ingin Anda lakukan, tetapi ini adalah cara saya menerjemahkan kode contoh Anda ....
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;
}
}
Atau, Anda dapat membuat metode pengambil untuk text
.
Sekarang Anda bisa melakukannya Strings.STRING_ONE.toString();
private String text
harus final.final
akan lebih baik.new
konstruktorprivate
. Pada dasarnya, pembuatan objek dilarang danfinal
tidak benar-benar diperlukan dalam kasus ini.setText(String)
pada enum dan itu dapat melepaskan neraka :)final
jenis dokumen maksud Anda bahwa itu adalah konstan dengan dukungan kompiler. Jika Anda menggunakanString
konstanta, Anda tidak akan menyatakannyapublic static String
, bukan?Nilai String Khusus untuk Enum
dari http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
Nilai string default untuk java enum adalah nilai nominalnya, atau nama elemen. Namun, Anda dapat menyesuaikan nilai string dengan menimpa metode toString (). Sebagai contoh,
Menjalankan kode tes berikut akan menghasilkan ini:
sumber
bin
direktori: EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class yang akan bertambah sangat cepat. Terbaik untuk melakukannya sebagai jawaban yang diharapkan, dengan memberikan nilai pada konstruktor enum. Saya sebenarnya tidak setuju dengan penggantiantoString()
; Saya percaya lebih baik menggunakan pengambil yang eksplisit sepertigetKey()
karena menggantitoString()
mungkin tidak terduga oleh pengguna enum lainnya.Gunakan
name()
metodenya:hasil panen
ONE
.sumber
Strings.STRING_ONE.name()
menghasilkan "STRING_ONE", bukan "ONE". Ini bukan jawaban yang bagus. Anda tidak dapat memiliki String yang tidak akan menjadi pengidentifikasi Java yang valid, dll.name()
dapat dipengaruhi oleh program obfuscator. Saya mengalami masalah yang sama beberapa waktu lalu. Misalnya, dengan Proguard Anda harus mengatasi ini. Lihat Memproses Kelas EnumerasiEntah nama enum sama dengan string yang Anda inginkan atau, secara umum, Anda bisa mengaitkan atribut arbitrer dengan nilai enum Anda:
Sangat penting untuk memiliki konstanta di bagian atas, dan metode / atribut di bagian bawah.
sumber
Bergantung pada apa yang Anda maksud dengan "gunakan mereka sebagai String", Anda mungkin tidak ingin menggunakan enum di sini. Dalam kebanyakan kasus, solusi yang diusulkan oleh Elite Gentleman akan memungkinkan Anda untuk menggunakannya melalui metode toString mereka, misalnya dalam
System.out.println(STRING_ONE)
atauString s = "Hello "+STRING_TWO
, tetapi ketika Anda benar-benar membutuhkan String (mis.STRING_ONE.toLowerCase()
), Anda mungkin lebih suka mendefinisikannya sebagai konstanta:sumber
toLowerCase()
solusi saya, mereka bisa pergiStrings.STRING_TWO.toString().toLowerCase()
.interface
di tempatfinal
kelas denganprivate
konstruktor. Ini adalah praktik yang tidak dianjurkan.Anda dapat menggunakannya untuk string Enum
Dan panggilan dari metode utama
sumber
Jika Anda tidak ingin menggunakan konstruktor , dan Anda ingin memiliki nama khusus untuk metode ini, coba ini:
Saya menduga ini adalah solusi tercepat . Tidak perlu menggunakan variabel final .
sumber
Dapatkan dan atur dengan nilai default.
sumber