JavaRush /وبلاگ جاوا /Random-FA /Enum در جاوا: نحوه استفاده از کلاس

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 روز واقعی در هفته وجود دارد و هر یک از آنها نامی دارند. بنابراین، وظیفه ما این است که به نوعی محدوده مقادیر ممکن را برای کلاس " روز هفته " محدود کنیم. قبل از جاوا 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 Man {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }

    نتیجه:

    DayOfWeek{title='Sunday'}

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

enum چیست؟

بنابراین، Enum در جاوا چیست ؟ بیایید به مثال همان DayOfWeek نگاه کنیم :
public enum DayOfWeek {

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

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
متغیر dayOfWeek در حالت روز تعیین می کند که چه روزی است. و اینجا کلاس دانش آموز ما است:
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() با استفاده از Enum، اقدامات بعدی دانش‌آموز را مشخص می‌کنیم. ما حتی به طور دقیق توضیح ندادیم که هر متغیر در DayOfWeek به چه معناست ، و این ضروری نیست: مکانیسم روزهای هفته از قبل واضح است، و اگر از آن به شکل فعلی استفاده کنیم، هر توسعه‌دهنده‌ای می‌فهمد که چه در کد شما اتفاق می افتد. مثال دیگری از راحتی Enum این است که ثابت های آن را می توان با دستور switch استفاده کرد . به عنوان مثال، ما در حال نوشتن برنامه ای برای یک رژیم غذایی سخت هستیم که در آن وعده های غذایی بر اساس روز برنامه ریزی شده است:
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
       }
   }
}
این یکی از مزایای Enum نسبت به راه حل قدیمی است که قبل از جاوا 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='Thursday'}, 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='Sunday'}

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