0Pricing
Java Academy · レッスン

フィールドとメソッドを持つ列挙型

列挙型にフィールド、コンストラクター、メソッドを追加して、振る舞いをカプセル化します。

「フィールドとメソッドを持つ列挙型」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

フィールドとメソッドを持つ列挙型

列挙型の定数にはデータを持たせることができます。フィールドを宣言し、コンストラクターを追加します。コンストラクターは自動的にprivateになります。

列挙型にフィールドを宣言する

クラスが読み込まれると、各列挙型の定数がコンストラクターを呼び出します。フィールドの値は一度だけ設定され、finalで宣言した場合は不変です。

enum Planet {
    MERCURY(3.303e+23, 2.4397e6),
    VENUS  (4.869e+24, 6.0518e6),
    EARTH  (5.976e+24, 6.37814e6),
    MARS   (6.421e+23, 3.3972e6);

    private final double mass;    // kilograms
    private final double radius;  // meters

    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    public double mass()   { return mass; }
    public double radius() { return radius; }
}

列挙型にメソッドを追加する

列挙型には、計算プロパティを含め、クラスに記述できるあらゆるメソッドを定義できます。

enum Planet {
    EARTH(5.976e+24, 6.37814e6);
    // ... constructor and fields ...
    static final double G = 6.67300E-11;

    public double surfaceGravity() {
        return G * mass / (radius * radius);
    }

    public double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
}

double earthWeight = 75.0;
double mass = earthWeight / Planet.EARTH.surfaceGravity();
for (Planet p : Planet.values())
    System.out.printf("Weight on %s: %.2f%n", p, p.surfaceWeight(mass));

列挙型の定数に抽象メソッドを定義する

各定数は、列挙型本体で宣言された抽象メソッドに独自の実装を提供できます。

enum Operation {
    PLUS  { public double apply(double x, double y) { return x + y; } },
    MINUS { public double apply(double x, double y) { return x - y; } },
    TIMES { public double apply(double x, double y) { return x * y; } },
    DIVIDE{ public double apply(double x, double y) { return x / y; } };

    public abstract double apply(double x, double y);
}

System.out.println(Operation.PLUS.apply(3, 4));   // 7.0
System.out.println(Operation.TIMES.apply(3, 4));  // 12.0

文字列ラベル付きの列挙型

一般的なパターンとして、各定数に人間が読みやすいラベルを付け、フィールドとして保存します。

enum UserRole {
    GUEST("Guest User"),
    MEMBER("Registered Member"),
    ADMIN("Administrator"),
    SUPERADMIN("Super Administrator");

    private final String label;

    UserRole(String label) { this.label = label; }

    public String label() { return label; }

    public static UserRole fromLabel(String lbl) {
        for (UserRole r : values())
            if (r.label.equalsIgnoreCase(lbl)) return r;
        throw new IllegalArgumentException(lbl);
    }
}

System.out.println(UserRole.ADMIN.label()); // Administrator

複数のフィールドを持つ列挙型

列挙型には必要な数だけフィールドを持たせることができます。ここでは、通貨の列挙型にISOコードと記号の両方を保存します。

enum Currency {
    USD("US Dollar", "$"),
    EUR("Euro", "\u20ac"),
    GBP("British Pound", "\u00a3"),
    JPY("Japanese Yen", "\u00a5");

    public final String name;
    public final String symbol;

    Currency(String name, String symbol) {
        this.name = name;
        this.symbol = symbol;
    }

    public String format(double amount) {
        return String.format("%s%.2f", symbol, amount);
    }
}

System.out.println(Currency.EUR.format(99.99)); // \u20ac99.99

toString()をオーバーライドする

列挙型でtoString()をオーバーライドすると、定数名の代わりにカスタム文字列表現を返せます。

enum HttpMethod {
    GET, POST, PUT, PATCH, DELETE;

    @Override
    public String toString() {
        return name().toUpperCase();
    }

    public boolean hasBody() {
        return this == POST || this == PUT || this == PATCH;
    }
}

HttpMethod m = HttpMethod.POST;
System.out.println(m);            // POST
System.out.println(m.hasBody());  // true
System.out.println(HttpMethod.GET.hasBody()); // false

検証機能付きの列挙型

列挙型のコンストラクターでは引数を検証して、不正な状態を防ぐことができます。

enum DiscountTier {
    BRONZE(5), SILVER(10), GOLD(20), PLATINUM(30);

    public final int percentage;

    DiscountTier(int percentage) {
        if (percentage < 0 || percentage > 100)
            throw new IllegalArgumentException("Invalid: " + percentage);
        this.percentage = percentage;
    }

    public double apply(double price) {
        return price * (1 - percentage / 100.0);
    }
}

System.out.println(DiscountTier.GOLD.apply(100.0)); // 80.0

列挙型によるSingletonパターン

定数を1つだけ持つ列挙型は、JavaでSingletonを実装する最も安全な方法です。デフォルトでシリアライズに対応し、スレッドセーフでもあります。

enum AppConfig {
    INSTANCE;

    private String dbUrl = "jdbc:postgresql://localhost/mydb";
    private int maxConnections = 20;

    public String getDbUrl() { return dbUrl; }
    public int getMaxConnections() { return maxConnections; }

    public void setDbUrl(String url) { this.dbUrl = url; }
}

// Access the singleton
AppConfig config = AppConfig.INSTANCE;
System.out.println(config.getDbUrl());

ドメインモデルでの列挙型

列挙型は、型安全なカテゴリを表すためにドメインモデルで広く使用されます。たとえば、注文ステータス、支払い方法、通知の種類などです。

enum PaymentMethod {
    CREDIT_CARD("Credit Card", true),
    DEBIT_CARD("Debit Card", true),
    PAYPAL("PayPal", false),
    CRYPTO("Cryptocurrency", false),
    BANK_TRANSFER("Bank Transfer", false);

    public final String displayName;
    public final boolean instantCharge;

    PaymentMethod(String displayName, boolean instantCharge) {
        this.displayName = displayName;
        this.instantCharge = instantCharge;
    }
}

列挙型のフィールドと計算値

フィールドは固定データを保存し、メソッドは動的な値を計算します。定数データにはフィールドを、派生値にはメソッドを使用します。

enum DayType {
    MONDAY(false), TUESDAY(false), WEDNESDAY(false),
    THURSDAY(false), FRIDAY(false),
    SATURDAY(true), SUNDAY(true);

    private final boolean weekend;
    DayType(boolean weekend) { this.weekend = weekend; }

    public boolean isWeekend()  { return weekend; }
    public boolean isWeekday()  { return !weekend; }

    public static long weekdayCount() {
        return java.util.Arrays.stream(values())
            .filter(DayType::isWeekday).count();
    }
}
System.out.println(DayType.weekdayCount()); // 5

クイックチェック

列挙型のコンストラクターは、通常のクラスのコンストラクターとどのように異なりますか。

まとめ:フィールドとメソッドを持つ列挙型

重要なポイント:

  • フィールドとコンストラクターを追加して、定数ごとにデータを持たせます
  • 列挙型のコンストラクターは暗黙的にprivateです
  • 抽象メソッドを使うと、各定数が独自の実装を提供できます
  • toString()をオーバーライドして、表示名をカスタマイズします
  • 定数が1つだけの列挙型は、Singletonを実装する最適な方法です
  • 列挙型は型安全なカテゴリとしてドメインモデルに自然に統合できます

よくある質問

「フィールドとメソッドを持つ列挙型」レッスンは無料ですか?

はい。「フィールドとメソッドを持つ列挙型」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「フィールドとメソッドを持つ列挙型」で何を学びますか?

列挙型にフィールド、コンストラクター、メソッドを追加して、振る舞いをカプセル化します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「フィールドとメソッドを持つ列挙型」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 列挙型の定義と使用
  2. フィールドとメソッドを持つ列挙型
  3. 列挙型を使った switch 式
  4. EnumSet と EnumMap
← Java Academyに戻る