Почему Android не использует больше перечислений?

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

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

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

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

Solutions Collecting From Web of "Почему Android не использует больше перечислений?"

Этот ответ устарел с марта 2011 года.

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


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

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

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

 public enum Shrubbery { GROUND, CRAWLING, HANGING } 

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

 Shrubbery shrub = Shrubbery.GROUND; 

Вызывает поиск статического поля. Если «GROUND» было статическим окончательным int, компилятор рассматривал бы его как известную константу и встраивал ее.

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

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

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

Результаты:

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

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