Java: `enum` против` String` как параметры

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
11
0
16 887
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

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

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

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

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

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

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

@Martin: Я думаю о сравнении входных данных с String const, иначе будет выдано недопустимое исключение ввода, что нехорошо. Я задал вопрос из-за предложения открытых ключей, это, похоже, уменьшает концепцию WORA в Java.

Ande Turner 15.11.2008 08:38

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

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

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

Ande Turner 10.11.2008 12:17

Я думаю, что различие между «закрытыми» наборами клавиш и «открытыми» наборами клавиш является здесь наиболее важным фактором. Если вы посмотрите на API с динамически загружаемыми подключаемыми модулями, они могут предоставлять дополнительные функции, к которым можно получить доступ через параметр String, но с перечислением будет сложнее.

James Van Huis 10.11.2008 19:18

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

Перегрузка? Копия моего комментария к lycono: «Я думал об этом, что перечисление может иметь детали сопоставления для параметров, не зависящих от платформы, что оба должны использоваться, а не только строки, и что строковые методы должны быть устаревшими, чтобы стимулировать принятие перечислений»

Ande Turner 10.11.2008 12:18

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

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

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

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

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

Другие вопросы по теме