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 ( Ahli Enum ialah contoh
Elemen
enum
). Penghitungan tidak muncul di Jawa serta-merta. Konstruk bahasa khusus enum
telah diperkenalkan bermula dengan versi 1.5. Sehingga tahap ini, pengaturcara telah menggunakan kaedah lain untuk melaksanakan penghitungan.
pembinaan enum
Mari kita mulakan dengan contoh. Mari kita terangkanenum
jenis 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 mengisytiharkanenum
, 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.Enum
kami, masih mudah untuk mengesahkan bahawa enum
ia 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 enum
elemen -a.
Ahli Enum ialah contoh enum
kelas -yang boleh diakses secara statik
Elemen enum Season (WINTER, SPRING и т.д.)
ialah contoh yang boleh diakses secara statik enum
bagi -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, anyenum
-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 enum
diwarisi daripada kelas java.lang.Enum
. Mendapatkan elemen enum
dengan perwakilan rentetan namanya Selalunya tugas timbul untuk mendapatkan elemen enum
dengan perwakilan rentetannya. Untuk tujuan ini, dalam setiap enum
kelas, pengkompil secara automatik mencipta kaedah statik khas: public static EnumClass valueOf(String name)
, yang mengembalikan elemen penghitungan EnumClass
dengan 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 name
sama 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: enum
enum
public 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 enum
dan elemennya: Sama, tetapi dengan polimorfisme: Contoh terakhir menunjukkan penggunaan warisan dalam enum
. Lebih lanjut mengenai ini kemudian. Warisanenum
dalam Java enum
membolehkan anda melaksanakan hierarki kelas, objek yang dibuat dalam satu contoh dan boleh diakses secara statik. Dalam kes ini, elemen enum
boleh mengandungi pembina mereka sendiri. Mari kita berikan contoh: Di sini kita mengisytiharkan penghitungan Type
dengan tiga elemen INT
, INTEGER
dan 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
Object parse(String)
dan pembina Type(..., boolean)
. Pada masa yang sama, objek kelas INT
, INTEGER
dan STRING
wujud 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 Type
dan 3 nested
kelas yang diperolehi daripada Type
.
Kelas enum dinyahkompilasi dengan warisan
Untuk mengesahkan perkara di atas, kami juga membentangkan hasil penyusunan enumerasiType
daripada contoh di atas:
Penghitungan dan polimorfisme parametrik
Pembaca mungkin tertanya-tanya: " Mengapakah penghitungan Jenis di atas tidak menggunakan generik? " Hakikatnya ialah di Jawa penggunaan generik adalahenum
dilarang. 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 kelasjava.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/
GO TO FULL VERSION