JavaRush /Kurslar /All lectures for UZ purposes /Yangi ma'lumot turi – enum: sanash

Yangi ma'lumot turi – enum: sanash

All lectures for UZ purposes
Daraja, Dars
Mavjud

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
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
Yangi Day turi

Dushanba
Seshanba
Chorshanba
Payshanba
Juma
Shanba
Yakshanba

Ushbu turdagi o'zgaruvchilarga qiymatlarni quyidagicha berish mumkin:

Day kun = Day.MONDAY;

Misol:

Kod Izoh
Day day = Day.FRIDAY;
System.out.println(day);
Ekranda:
FRIDAY
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
Day[] days = Day.values();

for (Day day: days)
   System.out.println(day);







System.out.println(days[2]);
days o'zgaruvchisiga Day turidagi qiymatlar massivi saqlanadi (7 ta)

Massivning mazmunini ekranga chiqaramiz:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

ordinal() metodi konstantaning tartib raqamini qaytaradi. Uni enum klassida emas, enum qiymatida chaqirish kerak:

Kod Ekran chiqishi
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


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
public class Day
{
   public static final Day MONDAY = new Day(0);
   public static final Day TUESDAY = new Day(1);
   public static final Day WEDNESDAY = new Day(2);
   public static final Day THURSDAY = new Day(3);
   public static final Day FRIDAY = new Day(4);
   public static final Day SATURDAY = new Day(5);
   public static final Day SUNDAY = new Day(6);

    private static final Day[] array = {MONDAY, TUESDAY,
      WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

   private final int value;

   private Day (int value)
   {
      this.value = value;
   }

   public int ordinal()
   {
      return this.value;
   }

   public static Day[] values()
   {
      return array;
   }
}
Day klassi

Statik konstantalar ro'yxati







Day turining barcha qiymatlari bilan massiv


Ob'ektning Day qiymatini saqlaydigan o'zgaruvchi

Day 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
public class Day
{
  private int value;

  private Day (int value)
  {
    this.value = value;
  }

  public int ordinal()
  {
    return this.value;
  }
}


value o'zgaruvchisi Day ob'ektining qiymatini saqlaydi

Day 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
Day kun = Day.MONDAY;
int index = kun.ordinal();
Day newDay = Day.values()[index+2];
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
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY;

   public static List<Day> asList()
   {
      ArrayList<Day> list = new ArrayList<Day>();

      Collections.addAll(list, values());

      return list;
   }

}








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<Day> list = Day.asList();
list o'zgaruvchisiga enum Day ning barcha qiymatlari bilan ro'yxat saqlanadi.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION