Рубрики
Без рубрики

Эффективная Java! Используйте EnumSet Вместо битовых полей

Погружение в главу 36 Эффективной Java. С тегами java, effective, enum, architecture.

Иногда, когда у нас есть перечисляемый тип, который в основном используется в наборах, разработчики задают каждое значение как int или длинный причем каждый из них представляет собой разную степень двойки. Что-то вроде следующего:

public class TextStyles {
  public static final int STYLE_BOLD = 1 << 0; // 1
  public static final int STYLE_ITALIC = 1 << 1; // 2
  public static final int STYLE_UNDERLINE = 1 << 2; // 4
  public static final int STYLE_STRIKETHROUGH = 1 << 3; // 8

  public void applyStyles(int styles) { ... }
}

Затем этот класс можно использовать с помощью побитовых ИЛИ для объединения стилей. Например:

text.applyStyles(TextStyles.STYLE_BOLD | TextStyles.STYLE_UNDERLINE);

Мы также можем выполнять операции объединения и пересечения с помощью этой настройки. Это также доказывает, что он очень экономичен в пространстве. Все это говорит о том, что эта система страдает от тех же проблем, которые мы обсуждали в предыдущей главе. Во время отладки эта система, вероятно, страдает от еще большей путаницы, поскольку для определения текущего состояния переменных требуется учитывать биты каждого значения. Еще одна вещь, которую нам нужно учитывать, – это то, сколько перечислимых типов нам когда-либо понадобится, чтобы определить, нужен ли нам int или длинный . Если нам понадобится изменить этот тип позже, будет сложно изменить API по всей системе.

Существует лучший способ, встроенный в пакет java.util в виде класса EnumSet . Этот класс реализует интерфейс Set со всем его богатством, безопасностью типов и функциональностью. Кроме того, реализация чрезвычайно эффективна при использовании одного long внутри, если перечисление содержит менее 64 значений. Массовые действия с набором также выполняются с помощью побитовых операций. Это означает, что производительность сопоставима с битовым методом, описанным выше. В конечном итоге это лучшее из обоих миров.

Давайте посмотрим, как будет выглядеть наш приведенный выше пример с использованием правильного enum и EnumSet :

public class TextStyles {
  public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }

  public void apply(Set

Оригинал: “https://dev.to/kylec32/effective-java-use-enumset-instead-of-bit-fields-4c95”