Лучшая практика использования Java Enum

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

В качестве свойства:

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();
}

Ответы

Ответ 1

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

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

Ответ 2

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

Ответ 3

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