Перечисления против флагов int? - PullRequest
1 голос
/ 24 февраля 2011

Просто хотел несколько мнений по этому вопросу.Я всегда использовал флаги int, и мне было просто любопытно, насколько возможна простота использования, если бы я использовал перечисления в Java?

Ответы [ 7 ]

12 голосов
/ 24 февраля 2011

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

Преимущество не в производительности, а в выражении ваших намерений и более четком выражении ваших намерений, что приводит к более читабельному (и безопасному для типов) коду.Например, с целочисленными флагами ничто не будет жаловаться, если вы попытаетесь использовать (скажем) HTTP_STATUS_UNAUTHORIZED в качестве значения для вашего режима общего доступа к файлам при вызове метода ... тогда как, если оба они были перечислениями, параметр был бы строго типизирован в1005 * действительно разрешают только режимы совместного использования файлов (или, по общему признанию, ноль, если вы говорите о Java).

6 голосов
/ 24 февраля 2011

Как обычно, Effective Java лучше всего это говорит:

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

Нет простого способа перевести константы перечисления int в печатаемые строки.Если вы печатаете такую ​​константу или выводите ее из отладчика, все, что вы видите, это число, которое не очень полезно.Не существует надежного способа перебора всех констант перечисления int в группе или даже получения размера группы перечисления int.лучше: -))

Источник: Элемент 30: Используйте перечисления вместо int констант

5 голосов
/ 24 февраля 2011

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

1 голос
/ 24 февраля 2011

Эквивалентом использования флагов битовой маски является использование EnumSet (в котором используется битовая маска)

enum Colour { RED, GREEN, BLUE }
Set<Colour> colours = EnumSet.noneOf(Colour.class);
colours.add(Colour.RED);
colours.add(Colour.GREEN);
if (colours.contains(Colour.RED)) // true
   System.out.println(colours+" contains RED");

if (colours.contains(Colour.BLUE)) // false
0 голосов
/ 24 февраля 2011

В дополнение к типобезопасному коду у вас есть одна ссылка для совместного использования коллекции (возможность повторного использования)

0 голосов
/ 24 февраля 2011

An Enum тип со своими собственными методами и оптимизированные контейнеры . Вы должны предпочесть его флагам int, потому что он безопаснее и, возможно, более эффективен (хотя я сомневаюсь, что в нем вообще очень много!).

0 голосов
/ 24 февраля 2011

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

...