はじめに
Javaを学び直している途中に聞き慣れないコードを発見したのでメモ。
EnumSet について書こうとしたものの、前提の Enum や Set についての説明の方が多くなってしまった。
目次
そもそも Enum とは?
列挙型とも呼ばれる。
下記のような形で、要素や区分を一覧でまとめるときに使われる。
enum Feetype {
adult,
child,
senior
}
呼び出し側
class Test {
Feetype type;
boolean isAdult() {
// enum のクラス名.列挙子名の形で呼び出せる
// その際の型はFeetype型になる
return type.equals(Feetype.adult);
}
}
enum もクラスの一種なので、通常のクラスと同じように変数やメソッドを持つことができる。
enum Feetype {
adult( new AdultFee() ),
child( new ChildFee() ),
senior( new SeniorFee() )
private Fee fee;
// enum のコンストラクタは private にする必要がある(外部からのインスタンス生成は不可)
private Feetype(Fee fee){
this.fee = fee;
}
// 円を返すメソッドを実装
Yen yen() {
return fee.yen();
}
}
元から用意されているメソッドには下記のようなものがある。
valueOf
文字列から列挙子名を取得する。
APIから渡された文字列をアプリ内で使う enum に変換する時に使われそう。
例:
Feetype.valueOf("adult")
→Feetype 型のadult
が返却される。
valueOf
全ての列挙子を返却する。
例:
Feetype.values()
→Feetype[] 型で全ての列挙子が出力される
そもそもSetとは?
(ざっくり)
List型に似ている型。
Setの場合は順番が保証されず、ユニーク制約がついている点がListとは異なるらしい。
(本題) EnumSet について
Enum型でのみ使えるSetのこと。
EnumSet.of()
で Enum のSetを作成することができる。
Enum のグループを作りたい時に使うと便利そう。
Set overTwenty = EnumSet.of( Feetype.adult, Feetype.senior );
if(overTwenty){
// 大人に対して行いたい処理
}
余談:Kotlinだとどうなる?
Enum, Set, EnumSet ともにKotlinでも同様のメソッドが用意されているので、基本的には同じノリで使える様子。
ただし Set の場合は MutableSet
と Set
が用意されているので状況によって使い分けると良さそう。