JavaRush /Java Blogu /Random-AZ /Java-da Enum: Sinifdən necə istifadə etmək olar

Java-da Enum: Sinifdən necə istifadə etmək olar

Qrupda dərc edilmişdir
Salam! Bu yazıda sizə Java Enums haqqında məlumat verəcəyəm. Təsəvvür edin ki, sizə tapşırıq verilib: həftənin günlərini həyata keçirən bir sinif yaradın . İlk baxışdan bunda mürəkkəb bir şey yoxdur və kodunuz belə görünəcək:
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 + '\'' +
               '}';
   }
}
Və hər şey yaxşı görünür, amma bir problem var: DayOfWeek sinfinin konstruktoruna istənilən mətni ötürə bilərsiniz . Bu yolla kimsə həftənin gününü "Qurbağa", "Bulud" və ya "azaza322" yarada bilər. Bu, açıq şəkildə gözlədiyimiz davranış deyil, çünki həftənin yalnız 7 real günü var və hər birinin bir adı var. Buna görə də, vəzifəmiz " həftənin günü " sinfi üçün mümkün dəyərlərin diapazonunu bir şəkildə məhdudlaşdırmaqdır. Java 1.5-dən əvvəl tərtibatçılar bu problemin öz həllini tapmağa məcbur idilər, çünki dilin özündə hazır həll yolu yox idi. O günlərdə vəziyyət məhdud sayda dəyər tələb edirdisə, bunu etdilər:
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 + '\'' +
               '}';
   }
}
Burada nələrə diqqət etməlisiniz:
  • Şəxsi konstruktor. Əgər konstruktor özəl dəyişdirici ilə işarələnibsə , həmin konstruktordan istifadə etməklə sinif obyekti yaradıla bilməz. Və bu sinifdə yalnız bir konstruktor olduğundan DayOfWeek obyekti ümumiyyətlə yaradıla bilməz.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//error!
       		}
    }
  • Eyni zamanda, sinif bizə lazım olan şəkildə işə salınan tələb olunan sayda ictimai statik obyektləri ehtiva edir (günlərin adları düzgündür).

    Bu, başqa siniflərdə obyektlərdən istifadə etməyə imkan verdi.

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

    Nəticə:

    DayOfWeek{title='Bazar'}

Bu yanaşma bizə problemi həll etməyə imkan verdi. Həftənin 7 günü bizim ixtiyarımızda idi və heç kim yenisini yarada bilməzdi. Bu həll Joshua Bloch tərəfindən Effektiv Java kitabında təklif edilmişdir . Kitab, yeri gəlmişkən, çox gözəldir və hər hansı bir Java tərtibatçısının oxuması lazımdır.
Enum sinfindən necə istifadə etməli - 2
Java 1.5-in buraxılması ilə dil bu cür vəziyyətlər üçün hazır bir həll təqdim etdi - Enum enumeration . Enum da bir sinifdir. Lakin o, bizim kimi problemləri həll etmək üçün xüsusi olaraq “uyğunlaşdırılıb”: müəyyən məhdud dəyərlər diapazonunun yaradılması. Java yaradıcılarının artıq hazır nümunələri (məsələn, Enum-un artıq mövcud olduğu C dili) olduğundan, onlar optimal variantı yarada bildilər.

enum nədir?

Beləliklə, Java-da Enum nədir ? Eyni DayOfWeek nümunəsinə baxaq :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Artıq çox sadə görünür :) Bizim Enum daxilində statik çıxışı olan 7 sabit var. Proqramda məntiqi həyata keçirmək üçün artıq ondan istifadə edə bilərik. Məsələn, şagirdin bu gün məktəbə getməli olub-olmadığını müəyyən edəcək bir proqram yazaq. Tələbəmizin ScholarSchedule sinfi tərəfindən təyin olunmuş öz gündəlik rejimi olacaq :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Gün rejimində dayOfWeek dəyişəni günün hansı gün olduğunu müəyyən edir. Budur tələbəmizin 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() metodunda Enum istifadə edərək tələbənin sonrakı hərəkətlərini müəyyənləşdiririk. DayOfWeek -dəki hər dəyişənin nə demək olduğunu belə ətraflı təsvir etmədik və bu lazım deyil: həftənin günlərinin mexanizmi artıq aydındır və onu indiki formada istifadə etsək, hər hansı bir tərtibatçı nə başa düşəcək kodunuzda baş verir. Enumun rahatlığına başqa bir misal ondan ibarətdir ki, onun sabitləri switch ifadəsi ilə istifadə oluna bilər . Məsələn, yeməklərin gün ərzində təyin olunduğu ciddi bir pəhriz proqramı yazırıq:
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-dən əvvəl istifadə edilən köhnə həll üzərində Enumun üstünlüklərindən biridir : köhnə həll keçid ilə istifadə edilə bilməzdi .

Enum sinfi haqqında başqa nə bilmək lazımdır?

Enum sinfi onunla birlikdə gələn bütün imkanlara malik real sinifdir. Məsələn, həftənin günlərinin cari tətbiqi sizin üçün kifayət deyilsə, DayOfWeek- ə dəyişənlər, konstruktorlar və metodlar əlavə edə bilərsiniz:
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 + '\'' +
               '}';
   }
}
Bizim Enum sabitləri indi başlıq sahəsinə , alıcıya və ləğv edilmiş toString metoduna malikdir . Adi siniflərlə müqayisədə, Enumun bir ciddi məhdudiyyəti var - onu miras almaq olmaz. Bundan əlavə, siyahıların özünəməxsus üsulları var:
  • values() : Enum- da saxlanan bütün dəyərlərin massivini qaytarır:

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

    Nəticə:

    [DayOfWeek{title='Sunday'}, DayOfWeek{title='Monday'}, DayOfWeek{title='Tuesday'}, DayOfWeek{title='Wednesday'}, DayOfWeek{title='Cümə axşamı'}, DayOfWeek{title= 'Cümə'}, DayOfWeek{title='Şənbə'}]

  • ordinal() : sabitin sıra nömrəsini qaytarır. Geri sayma sıfırdan başlayır:

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

    Nəticə:

    0

  • valueOf() :Verilmiş ada uyğun olan Enum obyektini qaytarır:

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

    Nəticə:

    DayOfWeek{title='Bazar'}

Diqqət edin:Enum elementlərinin adlarını böyük hərflə yazırıq , çünki onlar sabitdir və camelCase deyil, sabitlər kimi təyin olunur .
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION