Kotlinで列挙型を扱う

Kotlinで列挙型を操作する

1. 概要

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

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

Enum constants today aren’t just mere collections of constants –プロパティを設定したり、インターフェイスを実装したりできます。

Kotlinの初心者は、Kotlinの基本–Introduction to the Kotlin Languageに関するこの記事を確認してください。

2. 基本的なKotlin列挙型

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

2.1. 列挙型の定義

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

enum class CardType {
    SILVER, GOLD, PLATINUM
}

2.2. 列挙型定数の初期化

Enums in Kotlin, just like in Java, can have a constructor.列挙型定数は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を使用できます。

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

この関数を次のように呼び出すことができます。

val cardType = CardType.getCardTypeByName("SILVER")

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

6. 結論

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

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

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