устранение дубликата кода Enum - PullRequest
22 голосов
/ 17 сентября 2008

У меня есть большое количество 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);  
}

Но это оказывается довольно бесполезным, потому что:

  1. Перечисление не может расширять класс
  2. Элементы перечисления (SKYPE, GOOGLE_TALK и т. Д.) Не могут расширять класс
  3. Я не могу предоставить реализацию getByCode () по умолчанию, потому что DefaultCodableEnum сам по себе не является Enum. Я попытался изменить DefaultCodableEnum для расширения java.lang.Enum, но это не разрешено.

Есть предложения, которые не основаны на размышлениях? Спасибо, Дон

Ответы [ 15 ]

0 голосов
/ 17 сентября 2008

Примерно настолько, насколько я понял, вы хотели создать в IntelliJ шаблон, который бы «реализовывал» общий код (используя enum's valueOf (String name)). Не идеально, но работает довольно хорошо.

0 голосов
/ 17 сентября 2008

Если вы действительно хотите наследовать, не забывайте, что вы можете реализовать шаблон enum самостоятельно , как в старых дурных Java 1.4 днях.

0 голосов
/ 17 сентября 2008

Как насчет статического универсального метода? Вы можете использовать его из методов getByCode () вашего перечисления или просто использовать его напрямую. Я всегда использую целочисленные идентификаторы для своих перечислений, поэтому мой метод getById () должен делать только это: return values ​​() [id] Это намного быстрее и проще.

0 голосов
/ 17 сентября 2008

Я не думаю, что это возможно. Однако вы можете использовать метод enum valueOf (String name), если собираетесь использовать имя значения перечисления в качестве кода.

0 голосов
/ 17 сентября 2008

Похоже, что вы на самом деле реализуете информацию о типе времени выполнения. Java предоставляет это как функцию языка.

Я предлагаю вам посмотреть RTTI или рефлексию.

...