2008-11-10 5 views
7

Я читал детали библиотек Systemset и get, но параметры обычно являются строками.Java: `enum` vs` String` as Параметры

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

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

ответ

18

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

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

3

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

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

5

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

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

+0

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

4

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

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

+0

Моя мысль об этом заключалась в том, что в перечислении могут быть данные о настройке для нестандартных параметров, которые должны использоваться не только в строках, а в том, что строковые методы должны быть устаревшими, чтобы поощрять принятие перечислений – 2008-11-10 09:17:31

+0

Я думаю, что различие между «закрытыми» ключи и «открытые» комплекты ключей являются наиболее важным фактором здесь. Если вы посмотрите на API с динамически загружаемыми плагинами, плагины могут внести дополнительную функциональность, к которой можно получить доступ через параметр String, но с переименованием будет сложнее. – 2008-11-10 16:18:14

0

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

12

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

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

1

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

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

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