Подтвердить что ты не робот

Enum vs android @Intdef - который лучше оптимизирован

Я знаю, что при сравнении констант с перечислениями константы занимают меньше места и могут быть примитивными. Я изучаю аннотацию @Intdef в андроиде и может кто-то сказать мне, если его лучшее хранилище будет использовать @Intdef против enum. Рекомендуем ли сейчас в android поместить enum в сторону и использовать @intdef, если возможно, продвигаться вперед? может @Intdef делать полиморфизм, я сомневаюсь?

из документации android относительно памяти overhead:

Для перечислений часто требуется более чем вдвое больше памяти, чем статические константы. Вы должны строго избегать использования перечислений на Android.

4b9b3361

Ответ 1

@Intdef явно более эффективен, он переносит нулевой вес только при наличии статических окончательных целых чисел, он все компилирует инструкции времени. перечисления являются классами и, как упоминалось в вашей ссылке, имеют печать в виде стопы. @Intdef предоставляет вам самую базовую функциональность перечислений, а именно проверку валидности и ни одну из других функций перечислений, таких как автоматические преобразования строк.

Большая часть андроидных документов устарела, это вполне может быть одним из них. Еще в первые дни андроида каждый бит подсчитывался, но теперь устройства намного более способны. Лично я бы выбрал между этими двумя вариантами в зависимости от того, что требуется по дизайну, и не слишком увлекся эффективностью. Кроме того, синтаксис для некоторых из этих более продвинутых аннотаций не делает для чистого легко читаемого кода, поэтому нет вентилятора. Однако, если ситуация требует хороших старых статических ints, @Intdef купит вам некоторую защиту за счет визуального беспорядка.

Ответ 2

В дополнение к предыдущим ответам я бы добавил, что если вы используете Proguard (и вы обязательно должны это сделать, чтобы уменьшить размер и обфускать свой код), то ваш Enums будет автоматически преобразован в @IntDef, где бы он ни находился возможно:

https://www.guardsquare.com/en/proguard/manual/optimizations

класс/распаковка/перечисление

Упрощает типы перечислений для целочисленных констант, когда это возможно.

Поэтому, если у вас есть некоторые дискретные значения, и некоторый метод должен позволять принимать только эти значения, а не другие одного типа, тогда я бы использовал Enum, потому что Proguard сделает эту ручную работу по оптимизации кода для меня.

И вот хорошее сообщение об использовании перечислений от Jake Wharton, посмотрите на него.

Как разработчик библиотеки, я признаю эту небольшую оптимизацию, которая должна быть выполнена, поскольку мы хотим как можно меньше влиять на размер, память и производительность приложения, насколько это возможно. Но важно осознать, что выбрасывает распределение Iterator против индексированного цикла, используя HashMap по сравнению с найденной в бинарной коллекции, такой как SparseArray, и помещает перечисление в ваш общедоступный API по сравнению с целыми значениями, где это уместно. Зная разницу, чтобы принимать обоснованные решения, важно то, что важно, и видео почти гвозди, кроме этого одного глупого стата.