У меня есть большое количество Enums, которые реализуют этот интерфейс:
/**
* Interface for an enumeration, each element of which can be uniquely identified by it's 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 и т. Д.) Не могут расширять класс
- Я не могу предоставить реализацию getByCode () по умолчанию, потому что DefaultCodableEnum сам по себе не является Enum. Я попытался изменить DefaultCodableEnum для расширения java.lang.Enum, но это не разрешено.
Есть предложения, которые не основаны на размышлениях?
Спасибо,
Дон