1. enum'ning paydo bo'lishi tarixi
Bugun biz Java'da yana bir ma'lumot turini o'rganamiz — enum. enum nomi Enumeration — sanash so'zidan kelib chiqqan. Bu qanday ma'lumot turi va nima bilan yeyiladi?
Ba'zida dasturchi ishida yangi ma'lumot turini yaratish zarurati paydo bo'ladi, uning o'zgaruvchilari faqat kichik va qat'iy belgilangan ro'yxatdan qiymatlar qabul qiladi.
Masalan, Kun turi faqat DUSHANBA, SESHANBA, CHORSHANBA, ... faqatgina 7 ta qiymat olishi mumkin. Yoki Oy turi faqat YANVAR, FEVRAL, MART, ... faqatgina 12 ta qiymat olishi mumkin.
Albatta, raqamlar (int turi) ishlatish mumkin: 1 — dushanba, 2 — seshanba va hokazo. Lekin kimdir tasodifan ushbu o'zgaruvchiga 8 yoki, masalan, 0 qiymatini bera olishi mumkin.
Osonlik bilan holat yuzaga kelishi mumkin, kimdir hafta kunlarini (yoki oylar) nol dan boshlanadi deb o'ylaydi, boshqasi esa birdan boshlangan deb o'ylaydi va hokazo.
Shuning uchun Java'da chegaralangan qiymatlar to'plamidan iborat bo'lgan ma'lumot turi yaratildi — enum.
2. Turi e'lon qilish
Yangi enum ma'lumot turini e'lon qilish quyidagicha ko'rinadi:
enum NomTur
{
QIYMAT1,
QIYMAT2,
QIYMAT3
}
Bu yerda NomTur — bu yangi tur (klass) nomi, va qavs ichida vergul bilan mumkin bo'lgan qiymatlar sanalgan: Qiymat1, Qiymat2, Qiymat3.
Keling, misol uchun Kun turini yaratamiz:
| Kod | Izoh |
|---|---|
|
Yangi Day turiDushanba Seshanba Chorshanba Payshanba Juma Shanba Yakshanba |
Ushbu turdagi o'zgaruvchilarga qiymatlarni quyidagicha berish mumkin:
Day kun = Day.MONDAY;
Misol:
| Kod | Izoh |
|---|---|
|
Ekranda: chiqadi |
3. enum metodlari
enum turining bir necha o'rnatilgan metodlari bor, bulardan ikkita juda qiziqarli:
Statik values() metodi enum turining barcha qiymatlarini massiv qaytaradi:
| Kod | Izoh |
|---|---|
|
days o'zgaruvchisiga Day turidagi qiymatlar massivi saqlanadi (7 ta)Massivning mazmunini ekranga chiqaramiz: |
ordinal() metodi konstantaning tartib raqamini qaytaradi. Uni enum klassida emas, enum qiymatida chaqirish kerak:
| Kod | Ekran chiqishi |
|---|---|
|
|
4. Klassga aylantirish
Aslida hech qanday mo'jiza yo'q, va kompilyator bizga ozgina sintaksis shakar qo'shib berdi. Kompilyatsiya vaqtida enum Day klassi oddiy klassga aylantiriladi:
| Kod, sodda versiya | Izoh |
|---|---|
|
Day klassiStatik konstantalar ro'yxati Day turining barcha qiymatlari bilan massivOb'ektning Day qiymatini saqlaydigan o'zgaruvchiDay klassining private konstruktori — Day klassining ob'ektlarini faqat Day klassi ichida yaratish mumkin.ordinal metodini Day ob'ektida chaqirish kerak.U ob'ektning qiymatini qaytaradi — value.Metod Day klassining barcha qiymatlari bilan statik massivni qaytaradi |
Agar Day klassidan barcha statik metod va o'zgaruvchilarni olib tashlasak, quyidagi natijaga erishamiz:
| Kod | Izoh |
|---|---|
|
value o'zgaruvchisi Day ob'ektining qiymatini saqlaydiDay ob'ektlarini faqat Day klassi ichida yaratish mumkin — private konstruktor.ordinal() metodi Day ob'ektining value qiymatini qaytaradi. |
Ya'ni, bu yerda vahimali hech narsa yo'q. Kompilyator Day klassini yaratadi, keyin enum qiymatlar bo'lgan konstantalarni unga qo'shadi, yetishmayotgan metodlarni qo'shadi va Day klassining konstruktorini private qiladi. Qanday qilib konstruktorlar ishlashini keyinroq o'rganamiz.
Endi, o'ylaymiz, tushunarli, nima uchun qiymatni o'zgaruvchiga quyidagicha kiritamiz:
Day kun = Day.MONDAY;
MONDAY — bu oddiygina Day klassining statik maydoni (konstanta) hisoblanadi. Va klassdan tashqarida statik metodlar va maydonlarga murojaat qilishda maydon yoki metod nomidan oldin klass nomini ko'rsatish kerak.
5. enum'ning boshqa metodlari
Barcha enum-klasslarida bir necha qiziqarli xususiyatlar mavjud.
String ga aylantirish va qaytarish
enum turidagi ob'ektni string ga aylantirish uchun, uning toString() metodini chaqirish kerak.
String str = Day.MONDAY.toString();
Qaytarib aylantirish uchun (string dan Day ob'ektiga) valueOf() statik metodidan foydalanish mumkin:
Day kun = Day.valueOf("MONDAY");
Bu juda qulay va ko'p holatlarda foydali.
Sonlarga aylantirish va qaytarib olish
enum turidagi ob'ektni qanday qilib sonlarga aylantirishni siz allaqachon bilasiz: buning uchun ordinal() metodini chaqirish kerak:
int index = Day.MONDAY.ordinal();
Qaytarib aylantirish uchun (sondan Day ob'ektiga) biroz uzunroq konstruktsiyadan foydalanish kerak:
Day kun = Day.values()[2];
Misollar:
| Kod | Izoh |
|---|---|
|
Dushanba Dushanba indeksini olish (0) Dushanbadan 2 kun keyingi kun |
Muqim moment, chunki enum turidagi qiymatlar ma'lum bir to'plamni tashkil qiladi, ularni == orqali taqqoslash mumkin. MONDAY ning ikki xil ob'ekti mavjud bo'lishi mumkin emas, har qanday enum qiymati faqatgina bitta ekzemplyarda mavjud bo'ladi. Shuning uchun enum turidagi o'zgaruvchilarni == orqali taqqoslash har doim ishlaydi.
6. enumga o'z metodlarini qo'shish
Kompilyatsiyada enum oddiy klassga o'xshatib o'zgartiriladi, shuning uchun unda metodlar e'lon qilish mumkin: bu metodlar kompilyator tomonidan yaratilgan klassga qo'shiladi. Masalan, biz xohlaymizki, bizning enum Day qiymatlar massivini emas, balki ro'yxatni qaytarsin.
Shunda biz unga quyidagi kod qo'shishimiz mumkin:
| Kod | Izoh |
|---|---|
|
Qiymatlar ro'yxatidan keyin nuqta-vergul qo'yish kerak. ArrayList ob'ektini yaratamiz.Arrays ning qiymatlari bilan to'ldiramiz: method values() undan qiymatlar qaytaradi.Ro'yxatni qaytaradi. |
Endi bu metodni kodingizda chaqirish mumkin:
| Kod | Izoh |
|---|---|
|
list o'zgaruvchisiga enum Day ning barcha qiymatlari bilan ro'yxat saqlanadi. |
GO TO FULL VERSION