Beberapa kali saya melihat orang menggunakan case-title atau bahkan semua penamaan huruf kecil untuk konstanta enum, misalnya:
enum Color {
red,
yellow,
green;
}
Ini membuat bekerja dengan bentuk string mereka menjadi sederhana dan mudah, jika Anda ingin melakukannya throw new IllegalStateException("Light should not be " + color + ".")
, misalnya.
Ini tampaknya lebih dapat diterima jika enum private
, tetapi saya masih tidak menyukainya. Saya tahu saya bisa membuat konstruktor enum dengan bidang String, dan kemudian menimpa toString untuk mengembalikan nama itu, seperti ini:
enum Color {
RED("red"),
YELLOW("yellow"),
GREEN("green");
private final String name;
private Color(String name) {
this.name = name
}
@Override public String toString() {
return name;
}
}
Tapi lihat berapa lama lagi. Ini menjengkelkan untuk terus dilakukan jika Anda memiliki banyak enum kecil yang ingin tetap sederhana. Apakah saya tetap bisa menggunakan format kasus yang tidak konvensional di sini?
sumber
Light should not be RED.
. Bagaimanapun, pesan ini adalah untuk pengembang, pengguna seharusnya tidak pernah melihatnya.Light should not be YELLOW.
saya kira itu adalah semacam konstanta, metode toString () hanya untuk tujuan debug, jadi saya tidak melihat mengapa Anda perlu mengubah tampilannya di pesan itu.Jawaban:
Jawaban singkatnya adalah, tentu saja, apakah Anda ingin memutuskan konvensi penamaan untuk apa yang pada dasarnya adalah konstanta ... Mengutip dari JLS :
Jawaban panjangnya, berkenaan dengan penggunaan
toString()
, adalah pasti metode untuk menimpa jika Anda ingin representasi nilai yang lebih mudah dibacaenum
. Mengutip dariObject.toString()
(penekanan milikku):Sekarang, saya tidak yakin mengapa beberapa jawaban melayang untuk berbicara tentang mengubah
enums
ke sana kemari denganString
nilai - nilai, tetapi saya hanya akan memberikan pendapat saya di sini juga. Serialisasienum
nilai seperti itu dapat dengan mudah diatasi dengan menggunakan metodename()
atauordinal()
. Keduanyafinal
dan dengan demikian Anda dapat yakin tentang nilai yang dikembalikan selama nama atau posisi nilai tidak berubah . Bagi saya, itu penanda yang cukup jelas.Yang saya kumpulkan dari hal di atas adalah: hari ini, Anda mungkin ingin menggambarkannya
YELLOW
sebagai "kuning" saja. Besok, Anda mungkin ingin menggambarkannya sebagai "Pantone Minion Yellow" . Deskripsi ini harus dikembalikan dari menelepontoString()
, dan saya tidak akan mengharapkan salah satuname()
atauordinal()
berubah. Jika saya melakukannya, itu adalah sesuatu yang harus saya selesaikan dalam basis kode atau tim saya, dan menjadi pertanyaan yang lebih besar dari sekadarenum
gaya penamaan .Sebagai kesimpulan, jika semua yang Anda ingin lakukan adalah mencatat representasi yang lebih mudah dibaca dari
enum
nilai - nilai Anda , saya masih menyarankan untuk tetap berpegang pada konvensi dan kemudian mengesampingkantoString()
. Jika Anda juga ingin membuat cerita bersambung menjadi file data, atau ke tujuan non-Jawa lainnya, Anda masih memilikiname()
danordinal()
metode untuk mendukung Anda, jadi tidak perlu khawatir tentang overridingtoString()
.sumber
Jangan modifikasi
ENUM
itu hanya bau kode yang buruk. Biarkan enum menjadi enum dan string menjadi string.Sebagai gantinya, gunakan konverter CamelCase untuk nilai string.
Ada banyak pustaka sumber terbuka yang sudah memecahkan masalah ini untuk Java.
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/CaseFormat.html
sumber
Mengirim enum antara kode Java dan aplikasi database atau klien, saya sering berakhir membaca dan menulis nilai enum sebagai string.
toString()
disebut secara implisit ketika menggabungkan string. Overriding toString () pada beberapa enums berarti bahwa kadang-kadang saya bisa sajadan terkadang saya harus ingat untuk menelepon
yang menyebabkan kesalahan, jadi saya tidak melakukan itu lagi. Sebenarnya, saya tidak mengesampingkan metode apa pun pada Enum karena jika Anda melemparkannya ke kode klien yang cukup, pada akhirnya Anda akan mematahkan harapan seseorang.
Buat nama metode baru Anda sendiri, seperti
public String text()
atautoEnglish()
atau apa pun.Ini adalah fungsi pembantu kecil yang bisa menghemat pengetikan jika Anda memiliki banyak enum seperti di atas:
Selalu mudah untuk memanggil .toUpperCase () atau .toLowerCase () tetapi mengembalikan case campuran bisa rumit. Perhatikan warnanya, "bleu de France." Prancis selalu menggunakan huruf kapital, jadi Anda mungkin ingin menambahkan metode textLower () ke enum Anda jika Anda mengalami itu. Saat Anda menggunakan teks ini di awal kalimat, vs. tengah kalimat, vs. dalam judul, Anda bisa melihat bagaimana satu
toString()
metode akan gagal. Dan itu bahkan tidak menyentuh karakter yang ilegal di pengidentifikasi Java, atau yang sulit untuk mengetik karena mereka tidak diwakili pada keyboard standar, atau karakter yang tidak memiliki huruf besar (Kanji, dll.).Tidak begitu sulit untuk menggunakan ini dengan benar:
Semoga itu juga menunjukkan mengapa menggunakan nilai case campuran enum akan mengecewakan Anda juga. Salah satu alasan terakhir untuk tetap menggunakan all-caps dengan konstanta garis bawah enum adalah bahwa hal tersebut mengikuti Prinsip Least Astonishment. Orang-orang mengharapkannya, jadi jika Anda melakukan sesuatu yang berbeda, Anda harus selalu menjelaskan diri sendiri, atau berurusan dengan orang-orang yang menyalahgunakan kode Anda.
sumber
toString()
enum tidak masuk akal bagi saya. Jika Anda menginginkan perilaku default yang dijamin dari nama enum, gunakanname()
. Saya tidak merasa "menggoda" sama sekali untuk diandalkantoString()
untuk memberikan kunci yang benarvalueOf(String)
. Saya kira jika Anda ingin membuktikan kebodohan pada enum Anda, itu satu hal, tapi saya pikir itu bukan alasan yang cukup baik untuk merekomendasikan bahwa Anda tidak boleh menimpatoString()
.<input type='checkbox' value=" + MY_CONST1 + ">
, dan kadang-kadang saya harus ingat untuk menelepon<input type='checkbox' value=" + MY_CONST1.name() + ">
, yang menyebabkan kesalahan.Jika ada kemungkinan sekecil apa pun representasi string ini dapat disimpan di tempat-tempat seperti database atau file teks, maka mengikat mereka ke konstanta enum aktual akan menjadi sangat bermasalah jika Anda perlu refactor enum Anda.
Bagaimana jika suatu hari Anda memutuskan untuk mengubah nama
Color.White
untukColor.TitaniumWhite
sementara ada file data di luar sana yang mengandung "Putih"?Juga, setelah Anda mulai mengkonversi konstanta enum ke string, langkah selanjutnya lebih jauh di jalan adalah menghasilkan string untuk dilihat pengguna, dan masalahnya di sini adalah, karena saya yakin Anda sudah tahu, bahwa sintaks java tidak izinkan spasi dalam pengidentifikasi. (Anda tidak akan pernah punya
Color.Titanium White
.) Jadi, karena Anda mungkin akan memerlukan mekanisme yang tepat untuk menghasilkan nama enum untuk ditampilkan kepada pengguna, yang terbaik adalah menghindari kerumitan enum yang tidak perlu.Yang telah dikatakan, Anda tentu saja dapat melanjutkan dan melakukan apa yang Anda pikirkan lakukan, dan kemudian refactor Anda nanti, untuk memberikan nama kepada konstruktor, ketika (dan jika) Anda mengalami masalah.
Anda dapat mencukur beberapa baris dari enum-with-constructor Anda dengan mendeklarasikan
name
bidangpublic final
dan kehilangan pengambil. (Apa cinta ini yang dimiliki programmer java terhadap getter?)sumber
public final static int white = 1;
ataupublic final static String white = "white";
(selain dari melanggar konvensi lagi), ini kehilangan jenis keamanan yang disediakan oleh enum.public final
medan contoh yang akan diinisialisasi dari berperilaku konstruktor persis seperti bidang non-akhir, kecuali bahwa Anda dicegah pada saat kompilasi dari menugaskan untuk itu. Anda dapat memodifikasinya melalui refleksi dan semua kode yang merujuknya akan segera mulai melihat nilai baru.Bisa dibilang, mengikuti konvensi penamaan UPPERCASE melanggar KERING . (Dan YAGNI ). misalnya, pada contoh kode Anda # 2: "RED" dan "red" diulang.
Jadi, apakah Anda mengikuti konvensi resmi atau mengikuti KERING? Panggilanmu.
Dalam kode saya, saya akan mengikuti KERING. Namun, saya akan memberikan komentar pada kelas Enum, mengatakan "tidak semua huruf besar karena (penjelasan di sini)"
sumber