このインターフェースを実装する 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);
}
しかし、これは以下の理由であまり役に立たないことが判明しました。
- 列挙型はクラスを拡張できない
- 列挙型の要素(SKYPE、GOOGLE_TALKなど)はクラスを拡張できません
- 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());
}
}