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

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

Из андроидных документов относительно издержек памяти:

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

Solutions Collecting From Web of "Enum vs android @Intdef – который лучше оптимизирован"

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

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

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

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

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

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

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

И вот хорошая статья об использовании перечислений от Джейка Уортона, взгляните на это.

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