Java: `enum` против` String` в качестве параметров - PullRequest
9 голосов
/ 10 ноября 2008

Я читал подробности о System библиотеках set и get методах, но параметры обычно являются строками.

Считаете ли вы использование String параметрами плохой практикой с момента включения enum?

Лучшая альтернатива как минимум может быть public final String, Нет?

Ответы [ 7 ]

21 голосов
/ 10 ноября 2008

Я бы посчитал Enums лучшим подходом, чем Strings. Они безопасны от типов, и сравнение их выполняется быстрее, чем сравнение строк.

В качестве альтернативы до Java 1.5 вы можете использовать шаблон enum, безопасный для типов, предложенный Джошуа Блохом в его книге «Эффективная Java». Для типов безопасных перечислений см. Также http://www.javacamp.org/designPattern/enum.html

14 голосов
/ 10 ноября 2008

Если ваш набор параметров ограничен и известен во время компиляции, используйте enum.

Если ваш набор параметров открыт и неизвестен во время компиляции, используйте строки.

5 голосов
/ 10 ноября 2008

Только потому, что вы объявляете public final String как то, что вы ожидаете передать в метод в качестве параметра, ничто не мешает мне передавать все, что мне нравится.

Использование enum s означает, что я не могу создать свой собственный объект для передачи, защищая обе стороны проблемы. Единственный раз, когда я могу подумать, что вы должны использовать константы Strings вместо перечислений, это если вам нужно оставить место для пользователя, чтобы расширить ваш метод для включения пользовательских функций ...

4 голосов
/ 10 ноября 2008

Если вы ссылаетесь на System.setProperty (), System.getProperty () или System.getenv (), я думаю, что здесь уместны строки, так как набор возможных ключей открыт. Параметр key соответствует фактическому значению текстового / строкового типа в каком-либо файле или хранилище где-либо.

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

3 голосов
/ 10 ноября 2008

Я выучил «метод наименьшего удивления». Инстинктивно, использование enum - это правильно. Так что я бы пошел на это. Я уверен, что создатели Java думают одинаково.

Редактировать : Отличное объяснение POLS: http://benpryor.com/blog/2006/06/29/api-design-the-principle-of-least-surprise/

2 голосов
/ 21 апреля 2011

Хотя использование перечислений является безопасным типом, необходимость преобразования перечисления в строку и наоборот довольно часто. И в Java нет встроенной функции для этого. И в конечном итоге вы будете использовать valueOf () и toString (). И использование этого подхода не будет сильно отличаться от использования только строк. Потому что вам нужно обрабатывать ситуации, когда строка не может быть преобразована в Enum.

Так что просто использовать статические финальные строки легко и является обычной практикой, AFAIK.

Например, вы захотите взаимодействовать с сервером, используя некоторый API. Вам нужно будет определить каждый метод и ответ как Enum. И тогда вам нужно будет добавить методы toString и valueOf. Почему бы просто не использовать String?

0 голосов
/ 10 ноября 2008

Использование строк в существующих API не является плохой практикой; изменение API - плохая практика только потому, что в Java теперь есть поддержка перечислений. Что касается новых API, я согласен с тем, что сказали все остальные.

...