Лучшие практики Java Enum - PullRequest
13 голосов
/ 13 мая 2011

Я видел два подхода к обработке перечислений со свойствами. Один лучше другого?

Как собственность:

public enum SEARCH_ENGINE {
    GOOGLE("http://www.google.com"),
    BING("http://www.bing.com");

    private final String url;

    private SEARCH_ENGINE(String url) {
        this.url = url;
    }

    public String getURL() {
        return url;
    }
}

Как метод:

public enum SEARCH_ENGINE {
    GOOGLE {
        public String getURL() {return "http://www.google.com";}
    },
    BING {
        public String getURL() {return "http://www.bing.com";}
    };

    public abstract String getURL();
}

Ответы [ 3 ]

19 голосов
/ 13 мая 2011

Первый явно выглядит чище для меня - он использует общность того, что каждый элемент перечисления будет иметь фиксированный String URL, который известен при инициализации.Вы эффективно повторяете эту «логику» в каждой реализации во второй версии.Вы переопределяете метод для обеспечения одинаковой логики («просто возвращайте строку, известную во время компиляции») в каждом случае.Я предпочитаю зарезервировать переопределение для изменений в поведении .

Я предлагаю сделать поле url закрытым, хотя, в первом.

0 голосов
/ 13 мая 2011

Я бы пошел с первым, так как компилятор жалуется, если вы как-то забыли добавить URL.Второй позволит вам делать ошибки здесь.

0 голосов
/ 13 мая 2011

Взгляните на пункт 21 из этой главы Эффективная Java Джоша Блоха . В нем говорится о типе безопасного перечисления.

...