JavaRush /Java Blog /Random-JA /Java の Enum: クラスの使用方法

Java の Enum: クラスの使用方法

Random-JA グループに公開済み
こんにちは!この記事ではJava Enumについて説明します。「曜日を実装するクラスを作成する」というタスクが与えられたと想像してください。一見すると、これには複雑なことは何もなく、コードは次のようになります。

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 + '\'' +
               '}';
   }
}
すべてがうまくいっているように見えますが、問題が 1 つあります。それは、DayOfWeekクラスのコンストラクターに任意のテキストを渡すことができるということです。このようにして、誰かが「カエル」、「クラウド」、または「azaza322」という曜日を作成できます。実際の曜日は 7 つしかなく、それぞれに名前があるため、これは明らかに予期した動作ではありません。したがって、私たちのタスクは、「曜日」クラスの可能な値の範囲を何らかの方法で制限することです。Java 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 + '\'' +
               '}';
   }
}
ここで注意すべきことは次のとおりです。
  • プライベートコンストラクター。コンストラクターがprivate修飾子でマークされている場合、そのコンストラクターを使用してクラスのオブジェクトを作成することはできません。また、このクラスにはコンストラクターが 1 つしかないため、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='日曜日'}

このアプローチにより、問題の大部分を解決することができました。私たちは週 7 日を自由に使うことができましたが、誰も新しい曜日を作成することはできませんでした。このソリューションは、Joshua Bloch によって著書『Effective Java』で提案されました。ちなみに、この本は非常に素晴らしく、Java 開発者にとって必読の書です。
Enumクラスの使い方 - 2
Java 1.5 のリリースにより、この言語には、そのような状況に対する既製のソリューションであるEnum列挙が導入されました。 Enumもクラスです。しかし、それは、特定の限られた範囲の価値観の創造という、私たちと同様の問題を解決するために特別に「調整」されています。Java の作成者はすでに既製のサンプル ( Enum がすでに存在するC 言語など) を持っていたため、最適なオプションを作成することができました。

列挙型とは何ですか?

では、Java の 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 の便利さのもう 1 つの例は、その定数を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
       }
   }
}
これは、Java 1.5 より前に使用されていた古いソリューションに対するEnum の 利点の 1 つです。古いソリューションはswitchでは使用できませんでした。

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 の 定数には、titleフィールド、ゲッター、およびオーバーライドされたtoStringメソッドが追加されました。通常のクラスと比較して、Enumには重大な制限が 1 つあります。それは、継承できないことです。さらに、列挙型には、列挙型に固有のメソッドがあります。
  • value() : Enumに格納されているすべての値の配列を返します。

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

    結論:

    [DayOfWeek{title='日曜日'}、DayOfWeek{title='月曜日'}、DayOfWeek{title='火曜日'}、DayOfWeek{title='水曜日'}、DayOfWeek{title='木曜日'}、DayOfWeek{title= '金曜日'}、曜日{title='土曜日'}]

  • 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要素は定数であり、キャメルケースではなくそのように指定されているため、列挙要素の名前を大文字にします。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION