Javaの列挙型に関する疑問
JavaではSE5以降、enumの実装が変わり、「制約つきのクラス」という感じの扱いになったのだが、それを使っているコードを眺めていて、コードクローンが量産されているケースに出会った。以下がその例である。
新しいenumでは、メンバを持てるようになったのだが、同じようなenumを定義したいときには、同じコードがそれぞれのenumで実装されることになる。これが100個とかになると、コードクローンが量産されてしまうのだ。
どなたか、これをリファクタリングしてコードクローンを取り除いていただけないだろうか。ひょっとすると、これはenumの使い方を間違っているのだろうか。
以下、私が短い時間で試行錯誤した結果をメモにしておく。
まず思いつく改善策は、「基底クラスを抽出して、そこに共通要素をまとめればいい」というもの。しかし、enum には extends が許されていないので、これは使えないことが分かった。
ただし、implements は許されているようなので、public final なフィールドは interfaceにまとめることができる。しかし、コンストラクタやメソッドは各 enum で実装しなければならない。
enumとMapを組み合わせるべきか。しかし、それではコードの重複は減るが、クライアントコードが複雑になる。
そもそも、このようなenumを定義する目的はなんだろう。。? 結局、そこに行き着くのか。
新しいenumでは、メンバを持てるようになったのだが、同じようなenumを定義したいときには、同じコードがそれぞれのenumで実装されることになる。これが100個とかになると、コードクローンが量産されてしまうのだ。
どなたか、これをリファクタリングしてコードクローンを取り除いていただけないだろうか。ひょっとすると、これはenumの使い方を間違っているのだろうか。
enum Enum1 { A("01"), B("02"), C("03"); public final String code; private Enum1(String code) { this.code = code; } } enum Enum2 { T01("001"), T02("002"); public final String code; private Enum2(String code) { this.code = code; } } public class Main { public static void main(String[] args) { Enum1 e1 = Enum1.A; Enum1 e2 = Enum1.B; System.out.println(e1.code); switch (e2) { case A: case B: case C: } } }
以下、私が短い時間で試行錯誤した結果をメモにしておく。
まず思いつく改善策は、「基底クラスを抽出して、そこに共通要素をまとめればいい」というもの。しかし、enum には extends が許されていないので、これは使えないことが分かった。
ただし、implements は許されているようなので、public final なフィールドは interfaceにまとめることができる。しかし、コンストラクタやメソッドは各 enum で実装しなければならない。
enumとMapを組み合わせるべきか。しかし、それではコードの重複は減るが、クライアントコードが複雑になる。
そもそも、このようなenumを定義する目的はなんだろう。。? 結局、そこに行き着くのか。
コメント