Javaの列挙型に関する疑問

JavaではSE5以降、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を定義する目的はなんだろう。。? 結局、そこに行き着くのか。

コメント

このブログの人気の投稿

Gbps でなく GT/s

HCSLに33オームの直列抵抗が必要な理由

PowerShellによるExcel/PowerPointの操作