JavaRush /Blog Java /Random-MS /Penghitungan dalam Java (java enum)
articles
Tahap

Penghitungan dalam Java (java enum)

Diterbitkan dalam kumpulan
Apabila pengaturcaraan, kita sering menghadapi keperluan untuk mengehadkan set nilai yang sah untuk jenis data tertentu. Jadi, sebagai contoh, hari dalam seminggu boleh mempunyai 7 nilai yang berbeza, bulan dalam setahun boleh mempunyai 12, dan musim boleh mempunyai 4. Untuk menyelesaikan masalah sedemikian, banyak bahasa pengaturcaraan yang ditaip secara statik menyediakan jenis data khas - penghitungan ( enum). Penghitungan tidak muncul di Jawa serta-merta. Konstruk bahasa khusus enumtelah diperkenalkan bermula dengan versi 1.5. Sehingga tahap ini, pengaturcara telah menggunakan kaedah lain untuk melaksanakan penghitungan. Penghitungan dalam Java (java enum) - 1

pembinaan enum

Mari kita mulakan dengan contoh. Mari kita terangkan enumjenis data untuk menyimpan musim menggunakan:
enum Season { WINTER, SPRING, SUMMER, AUTUMN }
Nah, contoh mudah penggunaannya:
Season season = Season.SPRING;
if (season == Season.SPRING) season = Season.SUMMER;
System.out.println(season);
Akibatnya SUMMER akan dicetak ke konsol . Saya fikir contoh itu jelas dan tidak memerlukan penjelasan.

Enum ialah kelas

Dengan mengisytiharkan enum, kami secara tersirat mencipta kelas yang diperoleh daripada java.lang.Enum. Secara konvensional, pembinaan enum Season { ... }adalah bersamaan dengan class Season extends java.lang.Enum { ... }. Dan walaupun pengkompil tidak membenarkan kami mewarisi secara eksplisit daripada java.lang.Enumkami, masih mudah untuk mengesahkan bahawa enumia diwarisi menggunakan reflection:
System.out.println(Season.class.getSuperclass());
Perkara berikut akan dipaparkan pada konsol:
class java.lang.Enum
Warisan sebenar dilakukan secara automatik untuk kami oleh pengkompil Java. Seterusnya, mari kita bersetuju untuk memanggil kelas yang dicipta oleh pengkompil untuk melaksanakan penghitungan -class enum, dan kemungkinan nilai jenis terhitung sebagai enumelemen -a.

Ahli Enum ialah contoh enumkelas -yang boleh diakses secara statik

Elemen enum Season (WINTER, SPRING и т.д.)ialah contoh yang boleh diakses secara statik enumbagi -class Season. Ketersediaan statik mereka membolehkan kami melakukan perbandingan menggunakan pengendali perbandingan rujukan ==. Contoh:
Season season = Season.SUMMER;
if (season == Season.AUTUMN) season = Season.WINTER;

Nama dan nombor siri elemen enum

Seperti yang dinyatakan sebelum ini, any enum-class inherits java.lang.Enum, yang mengandungi beberapa kaedah yang berguna untuk semua penghitungan. Contoh:
Season season = Season.WINTER;
System.out.println("season.name()=" + season.name() + " season.toString()=" + season.toString() + " season.ordinal()=" + season.ordinal());
Outputnya ialah:
season.name()=WINTER season.toString()=WINTER season.ordinal()=0
Kaedah name(), toString()dan ditunjukkan di sini ordinal(). Semantik kaedah adalah jelas. Perlu diingatkan bahawa kaedah ini enumdiwarisi daripada kelas java.lang.Enum. Mendapatkan elemen enumdengan perwakilan rentetan namanya Selalunya tugas timbul untuk mendapatkan elemen enumdengan perwakilan rentetannya. Untuk tujuan ini, dalam setiap enumkelas, pengkompil secara automatik mencipta kaedah statik khas: public static EnumClass valueOf(String name), yang mengembalikan elemen penghitungan EnumClassdengan nama yang sama dengan name. Contoh penggunaan:
String name = "WINTER";
Season season = Season.valueOf(name);
Hasil daripada melaksanakan kod, pembolehubah musim akan sama dengan Season.WINTER. Sila ambil perhatian bahawa jika elemen tidak ditemui, IllegalArgumentException akan dilemparkan dan jika ia namesama null, NullPointerException akan dilemparkan . Dengan cara ini, ini sering dilupakan. Atas sebab tertentu, ramai yang yakin bahawa jika fungsi mengambil satu hujah dan dalam keadaan tertentu membuang IllegalArgumentException , maka apabila meneruskannya ke sana , IllegalArgumentExceptionnull pasti akan dilemparkan juga . Tetapi itu di luar perkara. Jom sambung. Mendapatkan semua elemen penghitungan Kadangkala anda perlu mendapatkan senarai semua elemen kelas -kelas pada masa larian. Untuk tujuan ini, pengkompil mencipta kaedah dalam setiap -class . Contoh penggunaan: enumenumpublic static EnumClass[] values()
System.out.println(Arrays.toString(Season.values()));
Kami mendapat output:
[WINTER, SPRING, SUMMER, AUTUMN]
Ambil perhatian bahawa kaedah valueOf()mahupun kaedah tidak values()ditakrifkan dalam kelas java.lang.Enum. Sebaliknya, ia ditambah secara automatik oleh pengkompil apabila enum-class dikompilasi. Menambah kaedah anda sendiri pada enum-class Anda mempunyai peluang untuk menambah kaedah anda sendiri pada -class enumdan elemennya: Penghitungan dalam Java (java enum) - 2Sama, tetapi dengan polimorfisme: Penghitungan dalam Java (java enum) - 3Contoh terakhir menunjukkan penggunaan warisan dalam enum. Lebih lanjut mengenai ini kemudian. Warisanenum dalam Java enummembolehkan anda melaksanakan hierarki kelas, objek yang dibuat dalam satu contoh dan boleh diakses secara statik. Dalam kes ini, elemen enumboleh mengandungi pembina mereka sendiri. Mari kita berikan contoh: Penghitungan dalam Java (java enum) - 4Di sini kita mengisytiharkan penghitungan Typedengan tiga elemen INT, INTEGERdan STRING. Pengkompil akan mencipta kelas dan objek berikut:
  • Type- kelas berasal daripadajava.lang.Enum
  • INT— objek kelas 1 diperolehi daripadaType
  • INTEGER— objek kelas ke-2 diperolehi daripadaType
  • STRING— objek kelas ke-3 diperolehi daripadaType
Tiga kelas terbitan akan dibuat dengan kaedah polimorfik Object parse(String)dan pembina Type(..., boolean). Pada masa yang sama, objek kelas INT, INTEGERdan STRINGwujud dalam satu salinan dan boleh diakses secara statik. Anda boleh mengesahkan ini:
System.out.println(Type.class);
System.out.println(Type.INT.getClass() + " " + Type.INT.getClass().getSuperclass());
System.out.println(Type.INTEGER.getClass() + " " + Type.INTEGER.getClass().getSuperclass());
System.out.println(Type.STRING.getClass()  + " " + Type.STRING.getClass().getSuperclass());
Kami mendapat output berikut:
class Type
class Type$1 class Type
class Type$2 class Type
class Type$3 class Type
Ia boleh dilihat bahawa pengkompil mencipta kelas Typedan 3 nestedkelas yang diperolehi daripada Type.

Kelas enum dinyahkompilasi dengan warisan

Untuk mengesahkan perkara di atas, kami juga membentangkan hasil penyusunan enumerasi Typedaripada contoh di atas: Penghitungan dalam Java (java enum) - 5

Penghitungan dan polimorfisme parametrik

Pembaca mungkin tertanya-tanya: " Mengapakah penghitungan Jenis di atas tidak menggunakan generik? " Hakikatnya ialah di Jawa penggunaan generik adalah enumdilarang. Jadi contoh berikut tidak akan disusun:
enum Type<T> {}

Sambung belajar

Untuk pemahaman yang lebih mendalam tentang cara penghitungan berfungsi di Jawa, saya syorkan anda membiasakan diri dengan kod sumber kelas java.lang.Enum, dan juga menggunakan penyahkompil Jad untuk mengkaji kod yang dijana. Selain itu, mengkaji kod sumber perpustakaan Java adalah sangat diperlukan untuk memahami berapa banyak mekanisme dalam Java berfungsi dan berguna sebagai rujukan untuk reka bentuk berorientasikan objek. Pautan ke sumber asal: http://alexander.lds.lg.ua/
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION