きたぜ、enum。
プログラミング言語によっては、enumは名前付き整数値の集まりに過ぎないですが、プログラミング言語Javaでは、特殊な種類のクラスであり、enumの個々の値を表すインスタンスを持っています。
それを待っていた!
6.1 簡単なenumの例
Javaのenumは一種のクラスなので、enum型の変数には、その型のインスタンスか、nullだけを代入できる。
6.2 enum宣言
enumは、拡張することができない。(ですよね!)
enumは、インタフェースを実装することができる。(!!)
6.2.1 enum修飾子
6.3 enum定数宣言
6.3.1 生成
Javaのenumは一種のクラスなので、コンストラクタを設けることで任意の型を列挙することができる。
6.3.2 定数固有の振る舞い
定数固有の振る舞いのメソッドを使用することで、網羅しているかの検査をコンパイル時に行っており、そうすることは常に良いことです。
そうすることは常に良いことです!コンパイル時、甘美な響きだ……。
そしてこれ、StateパターンとかStrategyパターンとかを簡潔に実装できそうな感じがする。
6.4 java.lang.Enum
enumは複製できない。enumの同値性と同一性は同じ。enumはComparableであり、compareToメソッドにおいて、宣言された順に大きくなる。
enumには、他にもいくつかの便利なメソッドが備わっている。
enumには、EnumSetとEnumMapという、「非常に効率的なenum固有の2つのコレクションクラス」がある。
6.5 enumを使用すべきか否か
ここまででenum最高や!の感が著しく高まったところへ、ドバドバ水を差す。
結局のとこenumは(ほぼ)意味を乗せたクラスの簡易バージョンにすぎないので、複雑なことをやろうとしているなら本当にenumである必要があるのか(enumで用が足りるのか)入念な考慮が必要だ……。
でも最後にデレる。
サブクラス化を通しての特化が必要でなければ、独自のクラスを定義するよりは、enum型を使用するのが、大抵の場合には良いです。
これには胸キュンを禁じ得ないぜ、ゴスリン氏(ほか2名)……。
それにしても、Javaってやっぱ、一にサブクラス化、二にサブクラス化、三四がなくて五にサブクラス化だなって印象が、ここまでのところあります。