Почему Android не использует больше перечислений? - PullRequest
78 голосов
/ 28 января 2011

Мне очень понравилось использование C # и Java-перечислений в моем коде по нескольким причинам:

  • Они намного более безопасны для типов, чем целые числа, строки или наборы логических флагов.
  • Они приводят к более читаемому коду.
  • Труднее установить для перечисления недопустимое значение, чем для типа int или строки.
  • Они позволяют легко находить допустимые значения для переменной или параметра.
  • Все, что я прочитал, указывает на то, что они работают так же хорошо, как целые числа в C # и большинстве JVM.

Однако в платформе Android есть множество случаев, когда необходимо передавать флаги разных типов, но ни один из них, похоже, не использует перечисления. Вот несколько примеров, в которых я думаю, что их использование будет полезным: Toast.LENGTH_SHORT / Toast.LENGTH_LONG и View.GONE, View.VISIBLE и т. Д.

Почему это? Производят ли перечисления хуже, чем простые целочисленные значения в Dalvik? Есть ли какой-то другой недостаток, о котором я не знаю?

Ответы [ 3 ]

65 голосов
/ 28 января 2011

Этот ответ устарел по состоянию на март 2011 года.

Перечисления могут использоваться на Froyo и выше - согласно этому ответу ( Почему из советов по производительности Android было удалено «Избегать перечислений, где вам нужны только целые числа?» ) из команды виртуальной машины Android ( и его блог ).


Предыдущий ответ:

Официальная рекомендация команды Android - избегать перечислений всякий раз, когда вы можете их избежать:

Перечисления очень удобны, но к сожалению, может быть больно, когда размер и скорость имеет значение. Например, это:

public enum Shrubbery { GROUND, CRAWLING, HANGING }

добавляет 740 байт к ваш файл .dex по сравнению с эквивалентный класс с тремя публичными статические финальные числа. При первом использовании инициализатор класса вызывает метод на объектах, представляющих каждый из перечисленные значения. Каждый объект получает свое собственное статическое поле, а полный набор хранится в массиве статическое поле называется "$ VALUES"). Это много кода и данных, только для трех целые числа. Дополнительно это:

Shrubbery shrub = Shrubbery.GROUND;

вызывает поиск статического поля. Если "ЗЕМЛЯ" была статическим финалом, Компилятор будет рассматривать это как известный постоянный и встроенный.

Источник: Избегайте перечислений, где вам нужны только целые числа

14 голосов
/ 28 января 2011

Целые числа меньше и требуют меньше накладных расходов, что по-прежнему важно для мобильных устройств.

5 голосов
/ 09 мая 2012

Мой коллега провел небольшой тест в отношении этой ситуации.Он автоматически сгенерировал class и enum с одинаковым количеством «перечислений».Я считаю, что он сгенерировал 30000 записей.

Результаты были такими:

  • .class для class было примерно 1200 КБ
  • .class для enum был примерно 800 КБ

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...