Apakah lebih baik menggunakan string atau int untuk referensi enum di luar bagian java dari sistem?


11

Kami sedang berdiskusi di tempat kerja saya tentang penggunaan enum di Jawa.

Seorang rekan kerja berpendapat bahwa ketika menggunakan enum di sisi server, kapan pun diperlukan, kami harus menggunakan string untuk merujuknya (misalnya saat mengirim data dari JS ke server atau ketika menyimpan dalam database), dengan alasan bahwa ini jauh lebih jelas. untuk pengembang dan juga berpendapat bahwa itu akan gagal dengan cepat jika salah ketik.

Saya selalu menggunakan bilangan bulat untuk mengidentifikasi enum dalam kasus-kasus ini, karena itu akan menjadi pengidentifikasi yang tidak berubah dan tidak akan memiliki masalah kasus dan kesalahan ketik (meskipun jika dev membuat kesalahan dengan menggunakan nilai 2 bukannya 1, itu tidak akan gagal dengan cepat).

Menjadi sangat analitik tentang argumen ini, saya akan mengatakan bahwa menggunakan string lebih baik, tetapi saya mendapatkan perasaan aneh tentang hal itu (seolah-olah itu bukan pendekatan yang baik).

Apakah ada praktik terbaik mengenai diskusi ini yang bisa membimbing saya?

Sunting: Kapan pun memungkinkan, kami menggunakan enum itu sendiri, jadi semua kode Java kami menggunakan Enum. Maksud "referensi ke enum" Maksud saya: merujuk nilai dalam enum saat bertukar data dari JavaScript ke server atau menyimpan data dalam basis data


1
Apa yang dimaksud dengan "referensi enum" untuk Anda? Penggunaan normal dalam kode sumber? Serialisasi untuk menyimpan dalam basis data? Ekspresi untuk digunakan dalam dokumentasi pengguna? Ekspresi untuk digunakan dalam dokumentasi teknis? Jawabannya akan sangat berbeda untuk semua itu.
Kilian Foth

Saya telah mengedit pertanyaan dan saya harap ini lebih jelas sekarang: dengan "merujuk ke enum" Maksud saya merujuk nilai ketika bertukar data dari JavaScript ke Server atau sebaliknya atau menyimpan nilai dalam database
JSBach

Dalam API javascript saya pasti akan menggunakan string. Dalam DB keduanya memiliki kelebihan. Beberapa basis data telah mendukung enum.
CodesInChaos

Jawaban:


15

Pertanyaan bagus. Penggunaan enum di Jawa terutama dimaksudkan untuk menangani informasi yang agak kategoris. Contoh klasik menggunakan enum untuk menangani empat jenis kartu yang bisa dimiliki kartu. Ini memberikan semua keuntungan kinerja menggunakan integer dan juga jelas dalam program Anda.

Jadi di luar Jawa, mengapa Anda tidak terus menggunakan integer? Mungkin Anda tidak memiliki tipe enum di luar Jawa, meskipun itu tidak berarti Anda tidak dapat terus menggunakan integer untuk tujuan kinerja, bukan? Ya, itu sepenuhnya benar, meskipun pertimbangkan apa yang terjadi ketika Anda menambahkan nilai enum baru. Jika Anda tidak menambahkannya sampai akhir, semua nilai enum lainnya setelah nilai baru akan bertambah satu. Kami hanya akan menentukan angka sehingga tidak dapat berubah atau kami akan selalu menambahkannya sampai akhir. Apakah Anda yakin bahwa rekan kerja Anda akan selalu melakukannya dengan benar? Ah? Mungkin? Semoga? Mungkin Anda tidak 100% akan hal itu. Ingatlah hal itu sejenak.

Bos Anda memberi tahu Anda bahwa ada kekacauan di klien menggunakan perangkat lunak Anda setelah pembaruan terakhir. Sekarang semua entitas X bertindak seperti mereka diberi nilai enum Y bahkan jika mereka benar-benar ditugaskan Z. Anda memeriksa repositori dan ya, seseorang menambahkan nilai enum baru dan tidak mengikuti panduan Anda saat Anda memintanya. Sekarang Anda memiliki komplikasi menambahkan bahwa pada database yang tertulis 4, ketika itu benar-benar harus 3, termasuk catatan yang telah dimasukkan sebelum update yang benar-benar adalah 4. Apa enum nilai diajukan Popper terkait dengan 4 sih? Bukankah itu Y? Kamu tidak ingat. Anda perlu memeriksa program untuk memverifikasi. Sederhananya, ini berantakan.

Jika sebaliknya, database Anda menulis "HEARTS", "DIAMONDS", "SPADES", "CLUBS", Anda telah kehilangan sedikit dalam hal ruang dan mendapatkan begitu banyak. Memang benar kita berbicara tentang hit kinerja kecil, tetapi Anda benar-benar tidak boleh mengakses database yang sering membuat perbedaan. Adapun ruang, serahkan itu ke administrator sistem (bukan. Masalah Anda.).

Jika Anda telah membuat program sederhana yang mudah untuk diubah, Anda telah melakukan kebaikan dalam jangka panjang, percayalah. Aspek ini tidak berbeda dalam pendapat saya yang sederhana.


2
Poin bagus, tetapi Anda lupa tentang kasus di mana seseorang memutuskan untuk mengubah nama salah satu entitas enum ( HEARTSke Heartatau sesuatu dalam contoh Anda) dan tiba-tiba semuanya rusak lagi.
Scott Whitlock

1
@ScottWhitlock Tidak jika Anda bertanggung jawab untuk itu, meskipun mereka dapat memutuskan untuk mengubah nama seluruhnya. Mereka dapat secara tidak sengaja menghapus database dan menghapus proyek juga, tetapi kami tidak dapat menjelaskan setiap kemungkinan kejadian di sini.
Neil

5
@Neil - benar tetapi kami mencoba untuk memainkan peluang di sini. Saya tidak terbiasa dengan enum Java, tetapi dalam C #, saya secara eksplisit mengatur nilai untuk enum jika nilai perlu memiliki makna di luar program (seperti dalam database) (misalnya Hati = 1, Berlian = 2, dll.) . Karena itu bukan cara standar untuk menggunakan enum, itu harus memberikan jeda editor nanti. Ditambah komentar yang mencatat di mana lagi ini digunakan berguna.
Scott Whitlock

1
@ScottWhitlock Itu pasti cara yang lebih baik untuk melakukannya untuk menghindari masalah seperti itu. Meskipun seandainya Anda melakukan itu, Anda masih melihat 1, 2, 3, 4 pada database atau serial dalam beberapa file. Tidak ideal dari sudut pandang pemeliharaan dengan cara apa pun yang Anda potong.
Neil

2
Jika saya dapat menambahkan, jika enum diserialisasi sebagai string dan seseorang mengubah nama enum, selama deserialisasi kesalahan akan selama parsing. Jika enum int dan seseorang mengubah definisi, kesalahan akan semakin jauh, selama pemrosesan, yang akan lebih sulit untuk didiagnosis. CC @ScottWhitlock.
Endy Tjahjono

1

Saya setuju dengan jawaban Neil, tetapi hanya tambahan:

Dalam java enum adalah Objek, sehingga mereka dapat memiliki bidang dan metode. Jadi, Anda dapat memberikan masing-masing enum beberapa nilai yang ditentukan secara manual dan ketika merujuknya untuk pekerjaan luar, gunakan nilai itu sebagai gantinya.

Ini akan bertahan baik menambahkan / menghapus / menyusun ulang dan mengubah nama instance enum. Tetapi Anda harus menulis logika serialisasi / deserialisasi untuk bidang enum daripada menggunakan automagic yang tersedia di banyak alat. (Mudah, tetapi karya tambahannya).

Dan Anda harus menjaga nilai-nilai itu unik secara manual (tapi itu sama dengan enum gaya C), dan Anda dapat menulis tes untuk memeriksanya.


Ya, kami menyusuri jalan ini, tetapi kami menggunakan hibernate dan kami harus menambahkan beberapa kode tambahan untuk dapat menguraikan nilai ke / dari database dan sepertinya agak aneh, jadi kami memutuskan untuk menggunakan hubungan .STRING dan pergi dengan nama enum.
JSBach
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.