Лучшая практика Java enum - PullRequest
       7

Лучшая практика Java enum

11 голосов
/ 27 августа 2010

Это может показаться тривиальным вопросом, но я немного запутался в своих мыслях относительно перечислений.

Итак, у меня есть класс - скажем, он называется DVDPlayer - и я хочу иметь перечислениеэто означает, включен он, выключен или находится в режиме ожидания.

Так что я могу поместить enum в класс - это не имеет смысла вне класса.У меня такой вопрос - должно ли перечисление быть публичным, чтобы другие классы могли запрашивать значения, или я должен сделать его закрытым, а затем иметь методы "isOn", "isOFf" и "isStandby"?

Последнее звучит немного глупо, но я не уверен, стоит ли публиковать enum как общедоступный.

Ответы [ 6 ]

8 голосов
/ 27 августа 2010

Я бы сказал, что это хорошая идея сделать ее публичной. Основная причина в том, что приложение проще расширять , так как вам не придется думать о добавлении новых методов каждый раз, когда вы добавляете состояние.

Если вы решили сделать его общедоступным, вам следует подумать о том, чтобы сделать его перечислением верхнего уровня. Я действительно не понимаю, почему вы говорите «это не имеет смысла вне класса» . Я думаю, что DVDPlayerState звучит как превосходное перечисление публики / верхнего уровня.

2 голосов
/ 27 августа 2010

Как правило, вы хотите, чтобы все было как можно более приватно (хотя обычно это не тот случай использования перечислений), но из-за того, как задан ваш вопрос, я не уверен, что вы используете перечисления какпредназначен.

Вы хотите использовать перечисление для представления фиксированных значений;это более чистая альтернатива сохранению этих значений как статических целых чисел или строк.Таким образом, для перечисления, объявленного как

public enum DvdState { ON, OFF, STANDBY };

Ваш класс будет выглядеть примерно так:

public class DvdPlayer {
    private DvdState state = DvdState.OFF;

    public void setState(DvdState state) {
        this.state = state;
    }
}

А вызывающий класс будет использовать следующий код:

dvdPlayer.setState(DvdState.ON);
2 голосов
/ 27 августа 2010

Это зависит от того, как вы хотите использовать класс DVDPlayer из внешнего мира:

if (dvdPlayer.getState() == State.ON)

или

if (dvdPlayer.isOn())

Я думаю, что первый вариант лучше.Вам не нужно загрязнять ваш код делегирующими методами.

0 голосов
/ 19 апреля 2016

Полагаю, я буду первым, кто защитит использование методов здесь.Сначала подумайте о пользователях вашего класса.Чем меньше им нужно знать о вашей бизнес-сфере, тем лучше, поэтому не путайте их с такими понятиями, как «состояние».Вы бы не «установили состояние» DVD-плеера в реальной жизни, а просто «включили его» или «выключили, если выключили», что для меня кричит о методах.Кроме того, Java известна и любима за то, что она строго статически типизирована, что позволяет вам находить интерфейс исключительно по предложениям автозаполнения вашей IDE.Чтение метода turnOff имеет для меня смысл сразу, в то время как setState является неоднозначным и требует, чтобы я сначала посмотрел перечисление состояния, чтобы я знал, каким на самом деле может быть состояние.

0 голосов
/ 07 июня 2012

Если enum является частью общедоступного интерфейса, имеет смысл объявить его public . Это похоже на случай с DVPlayer , потому что вы говорите, что его можно запросить. Три метода " isOn ", " isOFf " и " isStandby " излишне раздувают открытый интерфейс.

Но бывают случаи, когда enum пригодится для использования в классе, и в этом случае его следует объявить private . Например, следующее объявление

private enum Format{DVD, BLURAY};

будет в порядке, если Формат используется внутри класса DVDPlayer , но не является частью открытого интерфейса ни как параметр, ни как возвращаемое значение метода.

0 голосов
/ 27 августа 2010

Публикация enum может иметь смысл.Тогда у вас будет что-то вроде этого:

DvdPlayer.State getState();

Если у вас только три состояния, может быть предпочтительнее использовать методы isOn, isOff и isStandby.Для большего количества штатов общедоступный список лучше.Также перечисление может использоваться в операторе switch, что удобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...