Kotlinで列挙型を扱う
1概要
このチュートリアルでは、Kotlin列挙型について詳しく説明します。
プログラミング言語の進化と共に、enumの使用法と応用も進歩しました。
-
今日の列挙型定数は単なる定数の集まり** ではありません – それらはプロパティを持ち、インターフェースを実装することができます。
Kotlinの初心者の方は、Kotlinの基本についてのこの記事をチェックしてください –
Kotlin言語の紹介
。
2基本Kotlin Enums
Kotlinの列挙型の基本を見てみましょう。
2.1. 列挙型の定義
列挙型を、クレジットカードの種類を表す3つの定数を持つものとして定義しましょう。
enum class CardType {
SILVER, GOLD, PLATINUM
}
2.2. 列挙型定数の初期化
-
KotlinのEnumは、Javaと同じようにコンストラクタを持つことができます** enum定数は
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共通のEnumコンストラクト
5.1. 名前による列挙型定数の取得
String
名でenum定数を取得するには、
valueOf()
static関数を使用します。
val cardType = CardType.valueOf(name.toUpperCase())
5.2. 列挙型定数を繰り返し処理する
すべての列挙型定数を反復処理するには、
values()
static関数を使用します。
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には静的メソッドという概念がないことに注意してください。ここでは、Kotlinの機能を使用して、Javaと同じ機能を取得する方法を示しました。
6. 結論
この記事では、Kotlin言語の列挙型について紹介し、それが重要な機能です。
列挙型の定義や定数の初期化などの簡単な概念をいくつか紹介しました。列挙型定数を匿名クラスとして定義したり、列挙型を実装したインターフェイスなど、高度な機能もいくつか示しました。
これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/core-kotlin[GitHubプロジェクト]にあります。これはMavenプロジェクトなので、そのままインポートして実行するのは簡単なはずです。