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プロジェクトであるため、そのままインポートして実行するのは簡単です。