Enum クラスはさまざまな理由で Android 界で多くの論争を巻き起こしていますが、それでも経験豊富な開発者によって日々使用されていることは証明されています。
(注意: ここでのコードの構文は Kotlin であるが、ここでの情報はすべて Java enum クラスにも適用される)
Enumクラスとは何か
簡単に言うと、Enumは定数のリストを保持する特別なクラス型です。 最も一般的な使用法は、1 つの特定のオブジェクトの異なるタイプを表現すること、または変数が特定の値のセットの 1 つにしかなり得ない場合です。 値がなければ、if や switch 文による検証で使用できます。
val directionToTreasure = Direction.NORTHwhen(directionToTreasure) { Direction.NORTH -> indicateNorth() Direction.SOUTH -> indicateSouth() Direction.EAST -> indicateEast() Direction.WEST -> indicateWest()}
おそらく、これらの指示関数を処理する最善の方法ではないですが、アイデアを得ることができます。
enum class Color(val rgb: Int) { RED(0xFF0000) GREEN(0x00FF00) BLUE(0x0000FF)}
この方法で enum クラスを使用すると、次のようにその値を取得できます:
val shirtColour = Color.BLUEval color: Int = shirtColour.rgb
Enum は他に何ができるのでしょうか。
簡単に言うと、たくさんあります。
まず、定数の代わりに、enum は独自のメソッドを持つ匿名クラスとして実装でき、ベースメソッドをオーバーライドすることが可能です。
val name: String // The name of the constantval ordinal: Int // The position of the constant in the list of valuesif (shirtColour.name == "BLUE") { // Do some blue stuff}
実際、これらの定数の使用により、enum と String/Int 型の間のマッピングも便利に行うことができます。
Enum -> Int
yourEnum.ordinal
Int -> Enum
EnumType.values()
String -> Enum
EnumType.valueOf(yourString)
Enum -> String
yourEnum.name
このマッピングを示している StackOverflow 上の人物に謝意を表す
Enum クラスの目的とは何か?
ほとんどの場合、enum クラスはより読みやすいコードを作成するために使用されます。 複数の異なる型を持つことができるオブジェクトがある場合、任意の整数よりも読みやすい値で識別する方がはるかに簡潔です。
// Bad codewhen(direction) { 0 -> goNorth() 1 -> goSouth() 2 -> goEast() 3 -> goWest()}// Good codewhen(direction) { Direction.NORTH -> goNorth() Direction.SOUTH -> goSouth() Direction.EAST -> goEast() Direction.WEST -> goWest()}
列挙型のもうひとつの有用な目的は、文字列として入ってくるデータがあり、最終的にそれを int 値にマップする必要がある場合、たとえば API でオブジェクトの型が与えられるが View 型に Int を必要とする RecyclerView Adapter にそれを渡す必要があるときなどです。
@JvmStaticfun getType(type: String): BlockType? = when(type) { "hero" -> ContentHero "products" -> ContentProductList else -> null }
Why you shouldn’t use Enum classes
I bet you’re thinking now’s “hold up a second.”. Enum の使用方法についてすべて教えてくれたのに、今度はそれを使うなと言うのか?
簡単に言うと、Enum は高価です。 携帯電話が日に日に良くなっているのは知っていますが、1つは、まだ性能の低い携帯電話を持つ人が多すぎること、2つは、アプリの作り方や使用するライブラリが、より多くのメモリを使用していることです。 Enums は、Dalvik で実行される携帯電話のメモリ問題になりますが、それは基本的に ART (Android Runtime Machine) の代わりに廃止されたものです。 さらに、貧しい国の人々でさえかなり強力な携帯電話を持っていること、および Proguard がこれまで以上にコードを最適化できるようになったことから、Enum はもはやパフォーマンスの問題を引き起こさないと言ってよいでしょう。 1 つの値を保持し、それに名前を付けます。
*Def
*Def 注釈は、特定の値のみを取り込む変数がある場合にも最適です。
@IntDef({RED, GREEN, BLUE})
Enum をこれらの選択肢の中で選ぶ理由は何でしょうか。 Kotlin で使用する場合、次のような switch 文を使用できます。
val foo = when(someEnum) {}
そして、そうするとき、enum のすべての定数のケースを処理することを強制され、さもなければ、コードはコンパイルされません。 定数と *def アノテーションでは、与えられるのはせいぜい lint 警告だけです。 enum は単に安全なコードにつながります。
(Credits to u/-manabreak from Reddit for this)
ですから enum の使用がアプリケーションのコードをより簡潔に、特に Kotlin の場合、より良いケースセーフに導く限り、ぜひとも存分に enumerate してください。