EnumとEnumメソッド
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 50/87。
enum(列挙型)は、固定された定数のセットを表す特別なクラス型です。曜日や注文ステータスのようなオプションを表すために任意の整数や文字列を使用する代わりに、enumは型安全で読み取り可能な値を提供します。
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day today = Day.MONDAY;
System.out.println(today); // 出力: MONDAY列挙型(Enums)は単なる定数以上の存在であり、完全なクラスです。フィールド、コンストラクタ、メソッドをそれらに追加することができます:
enum Size {
SMALL(10), MEDIUM(20), LARGE(30);
private int price;
Size(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
System.out.println(Size.MEDIUM.getPrice()); // 出力: 20すべての列挙型(enum)には、便利な組み込みメソッドが用意されています。values() メソッドはすべての定数の配列を返し、valueOf() は文字列を一致する列挙型定数に変換します。ordinal() メソッドは、定数の位置(0から開始)を返します:
for (Day d : Day.values()) {
System.out.println(d + " is at position " + d.ordinal());
}
Day day = Day.valueOf("FRIDAY"); // 文字列を列挙型に変換します列挙型(Enums)は、実行時に変更されない既知の固定された値のセットがある場合に最適であり、単なる定数を使用するよりもコードをより安全で表現力豊かなものにします。
チャレンジ
簡単フィールド、コンストラクタ、メソッドを持つ enum の強力な機能を紹介する、コーヒーショップの注文システムを構築しましょう。価格情報を保持する CoffeeSize enum と、顧客の注文を処理するシステムを作成します。
コードは3つのファイルに分けて構成します:
CoffeeSize.java: 関連する価格を持つコーヒーのサイズを表す enum を作成します。enum にはSMALL、MEDIUM、LARGEの3つの定数を持たせ、価格はそれぞれ2.50、3.50、4.50とします。各サイズには、private な
priceフィールド(double)、それを設定するためのコンストラクタ、およびそれを取得するためのgetPrice()メソッドが必要です。また、[size name] - $[price](例:SMALL - $2.5)という形式の文字列を返すgetDescription()メソッドも追加してください。Order.java: コーヒーの注文を表すクラスを作成します。Order にはcustomerName(String) とsize(CoffeeSize) の2つの private フィールドを持たせます。両方のフィールドを初期化するコンストラクタと、それぞれのゲッターメソッドを含めてください。以下の複数行の文字列を返す
getReceipt()メソッドを追加します:Order for: [customerName] Size: [size description from getDescription()] Total: $[price from the size]Main.java: コーヒーショップを動かしてみましょう!顧客名(String)とサイズ名("SMALL"、"MEDIUM"、"LARGE" などの String)の2つの入力を受け取ります。まず、
CoffeeSize.valueOf()を使用して、サイズの文字列を対応する enum 定数に変換します。顧客名とサイズを使用して Order を作成し、レシートを出力します。レシートを出力した後、空行を1つ出力し、
values()メソッドを使用してすべてのCoffeeSize値を反復処理することで、メニュー全体を表示します。各サイズについて、その説明を個別の行に出力してください。
入力は、顧客名とサイズ名("SMALL"、"MEDIUM"、"LARGE" のいずれか)の順で2つ受け取ります。
enum がサイズの識別子とその関連価格の両方をどのようにカプセル化しているかに注目してください。コード全体で個別の定数やマジックナンバーを使用するよりも、はるかにクリーンです!
チートシート
enum(列挙型)は、固定された定数のセットを表す特別なクラス型であり、型安全で読み取り可能な値を提供します:
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day today = Day.MONDAY;
System.out.println(today); // 出力: MONDAY列挙型は、フィールド、コンストラクタ、およびメソッドを持つことができます:
enum Size {
SMALL(10), MEDIUM(20), LARGE(30);
private int price;
Size(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
System.out.println(Size.MEDIUM.getPrice()); // 出力: 20組み込みの列挙型メソッド:
values()- すべての列挙定数の配列を返しますvalueOf(String)- 文字列を一致する列挙定数に変換しますordinal()- 定数の位置(0から開始)を返します
for (Day d : Day.values()) {
System.out.println(d + " is at position " + d.ordinal());
}
Day day = Day.valueOf("FRIDAY"); // 文字列を列挙型に変換します自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 入力を読み込む
String customerName = scanner.nextLine();
String sizeName = scanner.nextLine();
// TODO: valueOf() を使用して sizeName を CoffeeSize 列挙型に変換する
// TODO: 顧客名とサイズを指定して Order を作成する
// TODO: レシートを印刷する
// TODO: 空行を印刷する
// TODO: すべての CoffeeSize の値を反復処理して、フルメニューを表示する
// ヒント: すべての列挙定数を取得するには CoffeeSize.values() を使用する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造