Di jawaban atas, ada definisi enum. Saya ingin contoh bagaimana enum yang didefinisikan akan digunakan dalam kode. Misalnya bagaimana ctor yang didefinisikan digunakan untuk membuat instance enum dengan nilai integer tertentu.
ScottF
@ScottF jika saya jadi Anda, daripada menetapkan hadiah pada posting ini, saya lebih suka mengirim pertanyaan yang sama sekali baru ..... atau, baca dokumentasi tentang enum. Tampaknya Anda perlu memiliki pengetahuan inti tentangnya;)
lealceldeiro
enum ids {OPEN = 100, CLOSE};?
Tuan Oscar
Jawaban:
307
Enum Java tidak seperti enum C atau C ++, yang sebenarnya hanya label untuk bilangan bulat.
Java enum diimplementasikan lebih seperti kelas - dan mereka bahkan dapat memiliki banyak atribut.
Berdasarkan pernyataan Anda, apakah praktik terbaik menggunakan java untuk membuat enum bilangan bulat berurutan (mirip dengan C ++ enum), untuk indeks ke dalam array atau sesuatu, adalah dengan menulis: enum Id ({NAMA (0), AGE) 1 ), HEIGHT (2), WEIGHT (3); } Terima kasih, -bn
bn.
Mungkin, dan terutama jika Anda membuat cerita tentang nilai integral di suatu tempat.
lavinio
1
dapatkah Anda memberi tahu cara menggunakan enum ini dalam suatu fungsi?
Bugs Terjadi
2
Itu malas standar Java untuk tidak membiarkan nilai ditetapkan untuk enum. Setidaknya c # memungkinkan AND ini tipe-safe.
csmith
2
FWIW, C ++ 11 sekarang memiliki tipe-safe enum class.
phoenix
92
Iya. Anda bisa meneruskan nilai numerik ke konstruktor untuk enum, seperti:
Keren. Apakah mungkin untuk mencampur? Yaitu hanya menetapkan angka untuk nilai Enum yang dipilih.
Frederick Nord
pengubah pribadi berlebihan untuk konstruktor enum
Nino van Hooff
@FrederickNord - Tentu. Cukup tambahkan konstruktor pribadi kedua tanpa argumen yang menginisialisasi valueke (katakanlah) nol. Kemudian sertakan (katakanlah) DANCEdalam daftar nilai.
Perhatikan bahwa kedua cara ini menggunakan lebih sedikit memori dan lebih banyak unit proses .. Saya tidak mengatakan ini adalah cara terbaik tetapi hanya pendekatan lain.
Mengapa getColorValue()disinkronkan dalam contoh kedua?
josaphatv
@ josaphatv Semua fungsionalitas dalam contoh kedua adalah statis, tidak pernah berubah. Anda mungkin ingin melakukannya HL_COLORS.getColorValue(HL_COLORS.YELLOW);tanpa menginisialisasi enum.
mazunki
11
Jika Anda menggunakan tipe enum yang sangat besar, mengikuti dapat bermanfaat;
Fungsi ordinal () mengembalikan posisi relatif pengenal dalam enum. Anda dapat menggunakan ini untuk mendapatkan pengindeksan otomatis dengan offset, seperti dengan enum gaya-C.
Sunting: baru sadar ini sangat mirip dengan jawaban ggrandes , tapi saya akan meninggalkannya di sini karena sangat bersih dan sedekat mungkin dengan enum gaya C.
Dalam contoh Anda mengambil enum dan mendapatkan int. Bisakah Anda menunjukkan kebalikannya, mengambil int dan berakhir dengan enum (tanpa
kasing
Sesuai pertanyaan, saya percaya ini adalah jawaban yang paling cocok. Di sini kita telah mengubah indeks default enum menjadi mulai dari 100 tanpa mendefinisikan variabel baru dan menugaskan mereka melalui konstruktor.
Rahul Jain
@RahulJain Saya lebih suka menggunakan jawaban yang diterima. Tampaknya lebih bersih bagi saya.
lealceldeiro
1
@scottf
Enum seperti Singleton. JVM menciptakan instance.
Jika Anda akan membuatnya sendiri dengan kelas-kelas itu bisa jadi terlihat seperti itu
publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}
Dan bisa digunakan seperti itu:
publicclassHelloWorld{publicstaticclassMyEnum{finalpublicstaticMyEnum ONE;finalpublicstaticMyEnum TWO;static{
ONE =newMyEnum("1");
TWO =newMyEnum("2");}finalString enumValue;privateMyEnum(String value){
enumValue = value;}@OverridepublicString toString(){return enumValue;}}publicstaticvoid main(String[]args){System.out.println(MyEnum.ONE);System.out.println(MyEnum.TWO);System.out.println(MyEnum.ONE ==MyEnum.ONE);System.out.println("Hello World");}}
@ skottf, Anda mungkin bingung karena konstruktor yang ditentukan dalam ENUM.
Biarkan saya jelaskan.
Ketika class loadermemuat enumkelas, maka enumkonstruktor juga disebut. Tentang apa!! Ya, ini dipanggil OPENdan close. Dengan nilai 100untuk OPENdan 200untuk apaclose
Tapi, itu praktik buruk. enumdigunakan untuk mewakili constantssuka days of week, colors in rainbowyaitu sekelompok kecil konstanta yang telah ditentukan sebelumnya.
enum ids {OPEN = 100, CLOSE};
?Jawaban:
Enum Java tidak seperti enum C atau C ++, yang sebenarnya hanya label untuk bilangan bulat.
Java enum diimplementasikan lebih seperti kelas - dan mereka bahkan dapat memiliki banyak atribut.
Perbedaan besar adalah bahwa mereka adalah tipe-aman yang berarti Anda tidak perlu khawatir tentang menetapkan COLOR enum ke variabel SIZE.
Lihat http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html untuk informasi lebih lanjut.
sumber
enum class
.Iya. Anda bisa meneruskan nilai numerik ke konstruktor untuk enum, seperti:
Lihat Panduan Bahasa Sun Java untuk informasi lebih lanjut.
sumber
value
ke (katakanlah) nol. Kemudian sertakan (katakanlah)DANCE
dalam daftar nilai.bagaimana dengan menggunakan cara ini:
hanya ada satu metode ..
Anda dapat menggunakan metode statis dan meneruskan Enum sebagai parameter seperti:
Perhatikan bahwa kedua cara ini menggunakan lebih sedikit memori dan lebih banyak unit proses .. Saya tidak mengatakan ini adalah cara terbaik tetapi hanya pendekatan lain.
sumber
getColorValue()
disinkronkan dalam contoh kedua?HL_COLORS.getColorValue(HL_COLORS.YELLOW);
tanpa menginisialisasi enum.Jika Anda menggunakan tipe enum yang sangat besar, mengikuti dapat bermanfaat;
sumber
Jika Anda ingin meniru enum C / C ++ (basis num dan tambahan selanjutnya):
sumber
Fungsi ordinal () mengembalikan posisi relatif pengenal dalam enum. Anda dapat menggunakan ini untuk mendapatkan pengindeksan otomatis dengan offset, seperti dengan enum gaya-C.
Contoh:
Memberikan output:
Sunting: baru sadar ini sangat mirip dengan jawaban ggrandes , tapi saya akan meninggalkannya di sini karena sangat bersih dan sedekat mungkin dengan enum gaya C.
sumber
@scottf
Enum seperti Singleton. JVM menciptakan instance.
Jika Anda akan membuatnya sendiri dengan kelas-kelas itu bisa jadi terlihat seperti itu
Dan bisa digunakan seperti itu:
sumber
@ skottf, Anda mungkin bingung karena konstruktor yang ditentukan dalam ENUM.
Biarkan saya jelaskan.
Ketika
class loader
memuatenum
kelas, makaenum
konstruktor juga disebut. Tentang apa!! Ya, ini dipanggilOPEN
danclose
. Dengan nilai100
untukOPEN
dan200
untuk apaclose
Bisakah saya memiliki nilai yang berbeda?
Iya,
Tapi, itu praktik buruk.
enum
digunakan untuk mewakiliconstants
sukadays of week
,colors in rainbow
yaitu sekelompok kecil konstanta yang telah ditentukan sebelumnya.sumber
Saya pikir Anda bingung melihat enumerator C ++. Pencacah Jawa berbeda.
Ini akan menjadi kode jika Anda terbiasa dengan C / C ++ enums:
sumber