JavaRush /Java blogi /Random-UZ /Java'da Enum: sinfdan qanday foydalanish kerak

Java'da Enum: sinfdan qanday foydalanish kerak

Guruhda nashr etilgan
Salom! Ushbu maqolada men sizga Java Enums haqida gapirib beraman. Tasavvur qiling-a, sizga vazifa berilgan: hafta kunlarini amalga oshiradigan sinf yarating . Bir qarashda, bu borada hech qanday murakkab narsa yo'q va sizning kodingiz quyidagicha ko'rinadi:
public class DayOfWeek {

   private String title;

   public DayOfWeek(String title) {
       this.title = title;
   }

   public static void main(String[] args) {
       DayOfWeek dayOfWeek = new DayOfWeek("Saturday");
       System.out.println(dayOfWeek);
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Va hamma narsa yaxshi ko'rinadi, lekin bitta muammo bor: DayOfWeek sinfining konstruktoriga istalgan matnni yuborishingiz mumkin . Shunday qilib, kimdir haftaning kunini yaratishi mumkin "Qurbaqa", "Bulut" yoki "azaza322". Bu biz kutgan xatti-harakat emasligi aniq, chunki haftaning atigi 7 haqiqiy kuni bor va ularning har birining nomi bor. Shuning uchun bizning vazifamiz " hafta kuni " sinfi uchun mumkin bo'lgan qiymatlar oralig'ini qandaydir tarzda cheklashdir . Java 1.5 dan oldin ishlab chiquvchilar ushbu muammoni mustaqil ravishda hal qilishga majbur bo'lishdi, chunki tilning o'zida tayyor echim yo'q edi. O'sha kunlarda, agar vaziyat cheklangan miqdordagi qiymatlarni talab qilsa, ular shunday qilishdi:
public class DayOfWeek {

   private String title;

   private DayOfWeek(String title) {
       this.title = title;
   }

   public static DayOfWeek SUNDAY = new DayOfWeek("Sunday");
   public static DayOfWeek MONDAY = new DayOfWeek("Monday");
   public static DayOfWeek TUESDAY = new DayOfWeek("Tuesday");
   public static DayOfWeek WEDNESDAY = new DayOfWeek("Wednesday");
   public static DayOfWeek THURSDAY = new DayOfWeek("Thursday");
   public static DayOfWeek FRIDAY = new DayOfWeek("Friday");
   public static DayOfWeek SATURDAY = new DayOfWeek("Saturday");

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Bu erda nimaga e'tibor berish kerak:
  • Xususiy konstruktor. Agar konstruktor xususiy modifikator bilan belgilangan bo'lsa , ushbu konstruktor yordamida sinf ob'ektini yaratib bo'lmaydi. Va bu sinfda faqat bitta konstruktor bo'lgani uchun DayOfWeek ob'ektini umuman yaratib bo'lmaydi.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//error!
       		}
    }
  • Shu bilan birga, sinf bizga kerak bo'lgan tarzda ishga tushirilgan kerakli miqdordagi umumiy statik ob'ektlarni o'z ichiga olgan (kunlarning nomlari to'g'ri).

    Bu boshqa sinflarda ob'ektlardan foydalanish imkonini berdi.

    public class Man {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }

    Xulosa:

    DayOfWeek{title='Yakshanba'}

Ushbu yondashuv bizga muammoni hal qilish imkonini berdi. Bizning ixtiyorimizda haftaning 7 kuni bor edi va hech kim yangisini yarata olmadi. Ushbu yechim Joshua Bloch tomonidan "Effektiv Java" kitobida taklif qilingan . Aytgancha, kitob juda zo'r va har qanday Java dasturchisi uchun o'qishi shart.
Enum sinfidan qanday foydalanish kerak - 2
Java 1.5 ning chiqarilishi bilan til bunday vaziyatlar uchun tayyor echimni taqdim etdi - Enum enumeration . Enum ham sinfdir. Ammo u biznikiga o'xshash muammolarni hal qilish uchun maxsus "moslashtirilgan": ma'lum cheklangan qiymatlar doirasini yaratish. Java yaratuvchilari allaqachon tayyor misollarga ega bo'lganligi sababli (aytaylik, Enum allaqachon mavjud bo'lgan C tili), ular optimal variantni yaratishga muvaffaq bo'lishdi.

Enum nima?

Xo'sh, Java'da Enum nima ? Keling, xuddi shu DayOfWeek misolini ko'rib chiqaylik :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Bu allaqachon ancha sodda ko'rinadi :) Bizning Enum ichida statik kirishga ega 7 ta konstanta mavjud. Biz dasturda mantiqni amalga oshirish uchun allaqachon foydalanishimiz mumkin. Misol uchun, o'quvchining bugun maktabga borishi kerakligini aniqlaydigan dastur yozaylik. Talabamiz ScholarSchedule sinfi tomonidan belgilangan o'zining kundalik rejimiga ega bo'ladi :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Kun rejimidagi dayOfWeek o'zgaruvchisi qaysi kun ekanligini aniqlaydi. Va bu bizning talabamizning sinfi:
public class Scholar {

   private ScholarSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {

       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep some more!");
       } else {
           System.out.println("Damn, back to school :(");
       }
   }
}
WakeUp() usulida Enum yordamida biz talabaning keyingi harakatlarini aniqlaymiz. Biz hatto DayOfWeek -dagi har bir o'zgaruvchi nimani anglatishini batafsil tasvirlab bermadik va bu shart emas: hafta kunlarining mexanizmi allaqachon aniq va agar biz uni hozirgi ko'rinishida ishlatsak, har qanday ishlab chiquvchi nimani anglatishini tushunadi. kodingizda sodir bo'ladi. Enum qulayligining yana bir misoli shundaki, uning konstantalaridan switch iborasi bilan foydalanish mumkin . Masalan, biz qat'iy dieta uchun dastur yozmoqdamiz, unda ovqatlanish kun bo'yi rejalashtirilgan:
public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday lunch! Today you can even have a little sweet");
               break;
           case MONDAY:
               System.out.println("Monday Lunch: Chicken Noodles!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today is celery soup :(");
               break;
               //...and so on until the end
       }
   }
}
Bu Java 1.5 dan oldin ishlatilgan eski yechimga nisbatan Enum ning afzalliklaridan biridir : eski yechimni switch bilan ishlatib bo‘lmaydi .

Enum sinfi haqida yana nimalarni bilishingiz kerak?

Enum sinfi u bilan birga kelgan barcha imkoniyatlarga ega haqiqiy sinfdir. Misol uchun, agar hafta kunlarini joriy qilish siz uchun etarli bo'lmasa, DayOfWeek ga o'zgaruvchilar, konstruktorlar va usullarni qo'shishingiz mumkin:
public enum DayOfWeek {

   SUNDAY ("Sunday"),
   MONDAY ("Monday"),
   TUESDAY ("Tuesday"),
   WEDNESDAY ("Wednesday"),
   THURSDAY ("Thursday"),
   FRIDAY ("Friday"),
   SATURDAY ("Saturday");

   private String title;

   DayOfWeek(String title) {
       this.title = title;
   }

   public String getTitle() {
       return title;
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Bizning Enum konstantalarida endi sarlavha maydoni , oluvchi va bekor qilingan toString usuli mavjud . Oddiy sinflar bilan taqqoslaganda, Enum bitta jiddiy cheklovga ega - uni meros qilib bo'lmaydi. Bundan tashqari, ro'yxatlar o'ziga xos usullarga ega:
  • values() : Enumda saqlangan barcha qiymatlar qatorini qaytaradi:

    public static void main(String[] args) {
       		System.out.println(Arrays.toString(DayOfWeek.values()));
    }

    Xulosa:

    [DayOfWeek{title='Sunday'}, DayOfWeek{title='Monday'}, DayOfWeek{title='Tuesday'}, DayOfWeek{title='Wednesday'}, DayOfWeek{title='Thursday'}, DayOfWeek{title= 'Juma'}, DayOfWeek{title='Shanba'}]

  • ordinal() : doimiyning tartib raqamini qaytaradi. Ortga hisoblash noldan boshlanadi:

    public static void main(String[] args) {
    
       		int sundayIndex = DayOfWeek.SUNDAY.ordinal();
       		System.out.println(sundayIndex);
    }

    Xulosa:

    0

  • valueOf() :Berilgan nomga mos keladigan Enum obyektini qaytaradi:

    public static void main(String[] args) {
       DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY");
       System.out.println(sunday);
    }

    Xulosa:

    DayOfWeek{title='Yakshanba'}

Diqqat qilish:Biz Enum elementlarining nomlarini bosh harf bilan yozamiz, chunki ular doimiylar va camelCase emas, balki doimiylar sifatida belgilangan .
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION