CodeGym /وبلاگ جاوا /Random-FA /کلاس Enum در جاوا
John Squirrels
مرحله
San Francisco

کلاس Enum در جاوا

در گروه منتشر شد
سلام! در این مقاله قصد داریم در مورد Java Enums به شما بگوییم . تصور کنید که وظیفه زیر به شما داده شده است: کلاسی ایجاد کنید که روزهای هفته را پیاده سازی کند . در نگاه اول، این نسبتاً ساده به نظر می رسد. کد شما چیزی شبیه به این خواهد بود:
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 + '\'' +
               '}';
   }
}
به نظر می رسد همه چیز خوب است، اما یک مشکل وجود دارد: می توانید هر متنی را به سازنده کلاس DayOfWeek ارسال کنید . این بدان معناست که شخصی می تواند یک روز از هفته را با نام "Frog"، "Cloud" یا "azaza322" ایجاد کند. واضح است که این رفتاری نیست که ما انتظار داریم، زیرا تنها 7 روز واقعی در هفته وجود دارد و هر یک از آنها نام خاصی دارند. بنابراین، وظیفه ما این است که به نوعی محدوده مقادیر ممکن را برای کلاس DayOfWeek محدود کنیم . قبل از آمدن جاوا 1.5، توسعه دهندگان مجبور بودند به طور مستقل راه حل های خود را برای این مشکل اختراع کنند، زیرا این زبان راه حل آماده ای نداشت. در آن روزها، اگر برنامه نویسان نیاز داشتند تعداد مقادیر را محدود کنند، این کار را انجام می دادند:
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 + '\'' +
               '}';
   }
}
در اینجا چیزی است که باید توجه کنید:
  • سازنده خصوصی است. اگر سازنده با اصلاح کننده خصوصی علامت گذاری شده باشد ، نمی توان از آن برای ایجاد یک شی استفاده کرد. و از آنجایی که کلاس فقط یک سازنده دارد، هیچ شیء DayOfWeek هرگز نمی توان ایجاد کرد.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek(); // Error!
       		}
    }

  • البته، کلاس تعداد مورد نیاز اشیاء ثابت عمومی را دارد که به درستی مقداردهی اولیه شده اند (با استفاده از نام صحیح روزهای هفته).

    این اجازه می دهد تا این اشیاء در کلاس های دیگر استفاده شوند.

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

    خروجی:

    DayOfWeek{title = 'یکشنبه'}

این رویکرد تا حد زیادی مشکل را حل می کند. ما 7 روز از هفته را در اختیار داریم و هیچ کس نمی تواند روزهای جدید ایجاد کند. این راه حل توسط Joshua Bloch در کتاب Effective Java ارائه شده است . به هر حال، آن کتاب بسیار جالب است و برای هر توسعه دهنده جاوا باید آن را بخواند. نحوه استفاده از کلاس Enum - 2با انتشار جاوا 1.5، این زبان راه حل آماده ای برای چنین موقعیت هایی به دست آورد: Java Enums . Enum در جاوا نیز یک کلاس است. مخصوصاً برای حل مسائلی از این دست، یعنی ایجاد محدوده محدودی از مقادیر، «به خوبی تنظیم شده است». سازندگان جاوا قبلاً نمونه‌های آماده داشتند (به عنوان مثال، C قبلاً enum داشت )، بنابراین آنها توانستند بهترین نوع را ایجاد کنند.

پس Java Enum چیست؟

بیایید مثال DayOfWeek خود را دوباره مرور کنیم :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
حالا این خیلی ساده تر به نظر می رسد :) در داخل، Enum ما دارای 7 ثابت ثابت است. و این چیزی است که ما می توانیم از آن برای اجرای یک برنامه استفاده کنیم. به عنوان مثال، بیایید برنامه ای بنویسیم که تعیین کند آیا دانش آموزی باید امروز به مدرسه برود یا خیر. دانش آموز ما یک برنامه روزانه خواهد داشت که توسط کلاس StudentSchedule ارائه می شود :
public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
متغیر dayOfWeek شیء زمانبندی تعیین می کند که امروز کدام روز است. و این هم کلاس دانشجویی ما:
public class Student {

   private StudentSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {

       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep more!");
       } else {
           System.out.println("Damn, time for school again :(");
       }
   }
}
در متد wakeUp() از Java Enum برای تعیین اینکه دانش‌آموز باید چه کاری انجام دهد استفاده می‌کنیم . ما حتی جزئیات مربوط به هر زمینه را در DayOfWeek ارائه نکردیم ، و نیازی هم نداریم: واضح است که روزهای هفته قرار است چگونه کار کنند. اگر از آن به شکل فعلی استفاده کنیم، هر توسعه‌دهنده‌ای متوجه خواهد شد که در کد ما چه اتفاقی می‌افتد. مثال دیگری از راحتی Enum این است که ثابت های آن را می توان با دستور switch استفاده کرد. به عنوان مثال، بیایید برنامه ای برای یک رژیم غذایی سخت بنویسیم که در آن غذاها بر اساس روز برنامه ریزی می شوند:
public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday Dinner! You can even enjoy something a little sweet today.");
               break;
           case MONDAY:
               System.out.println("Lunch for Monday: chicken noodle soup!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today it's celery soup :(");
               break;
               //... and so on to the end
       }
   }
}
این یکی از مزایای Enums نسبت به راه حل قدیمی استفاده شده قبل از جاوا 1.5 است - راه حل قدیمی را نمی توان با سوئیچ استفاده کرد . چه چیز دیگری باید در مورد Enum بدانید ؟ Enum یک کلاس واقعی با تمام امکاناتی است که این امر مستلزم آن است. برای مثال، اگر اجرای فعلی روزهای هفته ناکافی است، می‌توانید متغیرها، سازنده‌ها و متدها را به DayOfWeek اضافه کنید :
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 + '\'' +
               '}';
   }
}
اکنون ثابت های Enum ما دارای یک فیلد عنوان ، دریافت کننده و روش toString هستند. در مقایسه با کلاس های معمولی، یک محدودیت جدی برای Enum اعمال شد - نمی توان آن را به ارث برد. علاوه بر این، شمارش ها روش های مشخصه ای دارند:
  • values() : آرایه ای از تمام مقادیر موجود در Enum را برمی گرداند :

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

    خروجی:

    [DayOfWeek{title = 'Sunday'}, DayOfWeek{title = 'Monday'}, DayOfWeek{title = 'Tuesday'}, DayOfWeek{title = 'Wednesday'}, DayOfWeek{title = 'Tursday'}, DayOfWeek{title = 'Friday'}، DayOfWeek{title = 'Saturday'}]

  • ordinal() : عدد ترتیبی ثابت را برمی گرداند. شماره گذاری از صفر شروع می شود:

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

    خروجی:

    0

  • valueOf() : شی Enum را که با نام ارسال شده مطابقت دارد برمی گرداند:

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

    خروجی:

    DayOfWeek{title = 'یکشنبه'}

توجه داشته باشید:برای تعیین فیلدهای Enum از حروف بزرگ استفاده می کنیم . اینها ثابت هستند، بنابراین به جای camelCase از تمام سرپوش ها استفاده می کنند .
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION