1. 概要

このチュートリアルでは、Kotlinの列挙型について詳しく説明します。

プログラミング言語の進化に伴い、列挙型の使用法とアプリケーションも進歩しました。

今日の列挙型定数は単なる定数のコレクションではありません–プロパティを持ち、インターフェイスを実装するなど、さまざまなことができます。

Kotlinの初心者は、Kotlinの基本に関するこの記事–Kotlin言語の概要を確認してください。

2. 基本的なKotlin列挙

Kotlinの列挙型の基本を見てみましょう。

2.1. 列挙型の定義

クレジットカードの種類を表す3つの定数を持つ列挙型を定義しましょう。

enum class CardType {
    SILVER, GOLD, PLATINUM
}

2.2. 列挙型定数の初期化

Kotlinの列挙型は、Javaの場合と同様に、コンストラクターを持つことができます。列挙型定数は Enum クラスのインスタンスであるため、定数はコンストラクターに特定の値を渡すことで初期化できます。

さまざまなカードタイプに色の値を指定しましょう。

enum class CardType(val color: String) {
    SILVER("gray"),
    GOLD("yellow"),
    PLATINUM("black")
}

特定のカードタイプの色の値には、次の方法でアクセスできます。

val color = CardType.SILVER.color

3. 匿名クラスとしての列挙型定数

匿名クラスとして作成することにより、特定の列挙型定数の動作を定義できます。 次に、定数はEnum定義内で定義された抽象関数をオーバーライドする必要があります。

たとえば、カードの種類ごとに、キャッシュバックの計算が異なる場合があります。

それを実装する方法を見てみましょう。

enum class CardType {
    SILVER {
        override fun calculateCashbackPercent() = 0.25f
    },
    GOLD {
        override fun calculateCashbackPercent() = 0.5f
    },
    PLATINUM {
        override fun calculateCashbackPercent() = 0.75f
    };

    abstract fun calculateCashbackPercent(): Float
}

匿名定数クラスのオーバーライドされたメソッドは、次のコマンドで呼び出すことができます。

val cashbackPercent = CardType.SILVER.calculateCashbackPercent()

4. インターフェイスを実装する列挙型

さまざまなカードタイプのカード制限を定義するICardLimitインターフェイスがあるとします。

interface ICardLimit {
    fun getCreditLimit(): Int
}

次に、列挙型がこのインターフェイスを実装する方法を見てみましょう。

enum class CardType : ICardLimit {
    SILVER {
        override fun getCreditLimit() = 100000
    },
    GOLD {
        override fun getCreditLimit() = 200000
    },
    PLATINUM {
        override fun getCreditLimit() = 300000
    }
}

カードタイプのクレジット制限にアクセスするには、前の例と同じアプローチを使用できます。

val creditLimit = CardType.PLATINUM.getCreditLimit()

5. 一般的な列挙型コンストラクト

5.1. 名前による列挙型定数の取得

String 名で列挙型定数を取得するには、 valueOf()静的関数を使用します。

val cardType = CardType.valueOf(name.toUpperCase())

5.2. 列挙型定数の反復

すべての列挙型定数を反復処理するには、 values()静的関数を使用します。

for (cardType in CardType.values()) {
    println(cardType.color)
}

5.3. 静的メソッド

列挙型に「静的」関数を追加するには、コンパニオンオブジェクトを使用できます。

companion object {
    fun getCardTypeByName(name: String) = valueOf(name.toUpperCase())
}

これで、次のコマンドでこの関数を呼び出すことができます。

val cardType = CardType.getCardTypeByName("SILVER")

Kotlinには静的メソッドの概念がないことに注意してください。 ここでは、Javaと同じ機能を取得する方法を示しましたが、Kotlinの機能を使用しています。

6. 結論

この記事では、Kotlin言語の列挙型とその主な機能を紹介します。

列挙型の定義や定数の初期化など、いくつかの簡単な概念を紹介しました。 また、列挙型定数を匿名クラスとして定義したり、列挙型がインターフェイスを実装したりするなど、いくつかの高度な機能も示しました。

これらすべての例とコードスニペットの実装は、GitHubプロジェクトにあります。 これはMavenプロジェクトなので、そのままインポートして実行するのは簡単です。