EnumとEnumメソッド
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 50/87。
enum(列挙型)は、固定された一連のconstantsを表す特別なclass型です。曜日やorderのステータスなどの選択肢を表すために任意の整数や文字列を使用する代わりに、enumは型安全で読みやすい値を提供します。
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day today = Day.MONDAY;
System.out.println(today); // 出力: MONDAYEnums は単なる constants 以上のものです。full クラスです。fields、constructors、methods を追加できます。
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() メソッドはすべての constants の配列を返し、valueOf() は文字列を一致する enum 定数に変換します。ordinal() メソッドは定数の位置(0 から開始)を返します。
for (Day d : Day.values()) {
System.out.println(d + " is at position " + d.ordinal());
}
Day day = Day.valueOf("FRIDAY"); // 文字列をenumに変換するEnumは、実行時に変わることのない既知の固定された値の集合がある場合に最適です。単純なconstantsを使用するよりも、コードを安全で表現力豊かにできます。
チャレンジ
簡単フィールド、コンストラクター、メソッドを備えた enum の強力さを示す、コーヒーショップの注文システムを構築しましょう。価格情報を保持する CoffeeSize enum と、customer の注文を処理するシステムを作成します。
コードを3つのファイルに分けて整理します。
CoffeeSize.java: コーヒーのサイズと関連する価格を表す enum を作成します。この enum には、価格がそれぞれ2.50、3.50、4.50の3つの定数、SMALL、MEDIUM、LARGEを定義します。各サイズには private な
priceフィールド(double)、それを設定する constructor、そして値を取得するgetPrice()method が必要です。また、次の形式の文字列を返すgetDescription()method も追加します:[size name] - $[price](例:SMALL - $2.5)Order.java: コーヒーの注文を表す class を作成します。Order には2つの private なフィールド、customerName(String)とsize(CoffeeSize)があります。両方のフィールドを初期化する constructor と、それぞれの getter method を含めます。次の複数行の文字列を返す
getReceipt()method を追加します。Order for: [customerName] Size: [size description from getDescription()] Total: $[price from the size]Main.java: コーヒーショップを実際に動かします。2つの入力、customer name(String)と size name("SMALL"、"MEDIUM"、または "LARGE" のような String)を受け取ります。まず、
CoffeeSize.valueOf()を使って size の文字列を対応する enum 定数に変換します。customer name と size を指定して Order を作成し、その後 receipt を出力します。receipt を出力した後、空の行を出力し、
values()method を使用してすべてのCoffeeSizeの値を iterating することで full menu を表示します。各サイズについて、その description を отдельの行に出力します。
入力は、customer name と size name の順に2つ受け取ります("SMALL"、"MEDIUM"、または "LARGE" のいずれか)。
enum がサイズの識別情報と関連する価格の both をカプセル化している点に注目してください。コード全体で別々の constants や magic numbers を使用するよりも、はるかにすっきりしています。
自分で試してみよう
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: sizeName を valueOf() を使って CoffeeSize 列挙型に変換する
// TODO: 顧客名とサイズで Order を作成する
// TODO: レシートを印刷する
// TODO: 空行を印刷する
// TODO: すべての CoffeeSize の値を反復処理して完全なメニューを表示する
// Hint: CoffeeSize.values() を使用してすべての列挙定数を取得する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造自分で練習してみよう: Javaオンラインコンパイラ