2010-08-27 3 views
9

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

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

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

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

ответ

8

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

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

+0

Я просто подумал, что у государства не должно быть собственной жизни, кроме DVDPlayer - это имеет смысл только в отношении DVDPlayer. – pecks

+6

В то же время, возможно. Возможно, у вас есть DvdPlayerRemoteControl, который очень заинтересован в том, что может иметь DvdPlayer. – mikek

+0

true. Я изменил пример в другом, чтобы опубликовать его здесь, поэтому я, вероятно, не думал об этом так много! – pecks

2

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

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

или

if (dvdPlayer.isOn()) 

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

+0

Вы правы, это именно то, к чему это сводится. – pecks

+1

На самом деле, я бы предпочел последнее, потому что isOn() читает намного быстрее, чем обертывание головы вокруг того, что может означать состояние, для которого вам сначала нужно будет просмотреть перечисление. –

0

Создание общего enum может иметь смысл. Вы бы тогда что-то вроде этого:

DvdPlayer.State getState(); 

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

2

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

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

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); 
+0

Этот образ мышления очень похож на чрезмерную инженерию. Я хочу включить или выключить плеер. Никто никогда не скажет, что хочет изменить или установить состояние игрока ... –

0

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

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

private enum Format{DVD, BLURAY}; 

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

0

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

Смежные вопросы