重複したEnumコードを削除するにはどうすればいいですか? 質問する

重複したEnumコードを削除するにはどうすればいいですか? 質問する

このインターフェースを実装する Enum が多数あります。

/**
 * Interface for an enumeration, each element of which can be uniquely identified by its code
 */
public interface CodableEnum {

    /**
     * Get the element with a particular code
     * @param code
     * @return
     */
    public CodableEnum getByCode(String code);

    /**
     * Get the code that identifies an element of the enum
     * @return
     */
    public String getCode();
}

典型的な例は次のとおりです。

public enum IMType implements CodableEnum {

    MSN_MESSENGER("msn_messenger"),
    GOOGLE_TALK("google_talk"),
    SKYPE("skype"),
    YAHOO_MESSENGER("yahoo_messenger");

    private final String code;

    IMType (String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }   

    public IMType getByCode(String code) {
        for (IMType e : IMType.values()) {
            if (e.getCode().equalsIgnoreCase(code)) {
                return e;
            }
        }
    }
}

ご想像のとおり、これらのメソッドは CodableEnum のすべての実装で実質的に同一です。この重複を排除したいのですが、正直なところ方法がわかりません。次のようなクラスを使用してみました。

public abstract class DefaultCodableEnum implements CodableEnum {

    private final String code;

    DefaultCodableEnum(String code) {
        this.code = code;
    }

    public String getCode() {
        return this.code;
    }   

    public abstract CodableEnum getByCode(String code);  
}

しかし、これは以下の理由であまり役に立たないことが判明しました。

  1. 列挙型はクラスを拡張できない
  2. 列挙型の要素(SKYPE、GOOGLE_TALKなど)はクラスを拡張できません
  3. DefaultCodableEnum 自体は Enum ではないため、getByCode() のデフォルト実装を提供することはできません。DefaultCodableEnum を変更して java.lang.Enum を拡張しようとしましたが、これは許可されていないようです。

反射に頼らない提案はありますか?ありがとう、ドン

ベストアンサー1

重複したコードをCodeableEnumHelperクラスにまとめることができます。

public class CodeableEnumHelper {
    public static CodeableEnum getByCode(String code, CodeableEnum[] values) {
        for (CodeableEnum e : values) {
            if (e.getCode().equalsIgnoreCase(code)) {
                return e;
            }
        }
        return null;
    }
}

CodeableEnumクラスは依然としてメソッドを実装する必要がありますgetByCodeが、メソッドの実際の実装は少なくとも 1 か所に集中されています。

public enum IMType implements CodeableEnum {
    ...
    public IMType getByCode(String code) {
        return (IMType)CodeableEnumHelper.getByCode(code, this.values());
    } 
}

おすすめ記事