Насколько я понимаю, логическое значение обычно хранится в виде int в реализации JVM. Это правильно?
Конечно, это зависит от реализации JVM, но, вероятно, верно для реализаций на основных процессорах.
В этом случае, безусловно, 32 флага представляют собой значительное сокращение занимаемой памяти.
Если у вас есть 32 флага в классе и большое количество экземпляров этого класса, да. Если у вас никогда не бывает более нескольких сотен экземпляров, беспокоиться не о чем.
Насколько я понимаю, процессоры очень сильно зависят от числа, а побитовые операции примерно так же эффективны, как в вычислительных процессах.
Это правда.
Есть ли снижение производительности или даже выигрыш в использовании побитовых операций над логическими операциями?
Это зависит также от использования памяти. Если вы работаете очень интенсивно только с несколькими объектами, побитовые операции могут замедлить работу. Если у вас много объектов, уменьшенная память, вероятно, значительно улучшит производительность из-за лучшего поведения кэширования.
Есть ли лучший способ сделать то же самое? Разрешает ли Enum комбинацию флагов, т. Е. FLAGX = FLAG1 | Flag2
Вместо того, чтобы выполнять побитовые операции самостоятельно, вы можете (и должны) использовать BitSet
. И да, было бы еще чище, если бы вы могли работать с Enums и EnumSet
, но если бы у вас было несколько перечислений с несколькими элементами в каждом, это, вероятно, не дало бы желаемой экономии памяти, из-за накладных расходов для нескольких EnumSet
экземпляров.