Моделирование частичного перечисления - PullRequest
0 голосов
/ 27 сентября 2019

Допустим, у меня есть поле с именем Specifier, которое может быть одним из 100 экземпляров (это число может увеличиться в будущем).В коде я обычно использую только их подмножество для сравнения и логики.

Как лучше всего моделировать такое поведение?

Specifier s = new Specifier(123);
Specifier s2 = Specifier.KNOWN; //KNOWN == Specifier(123)

//possible comparation should be true since KNOWN can be 123
(s == s2) == true;

В этом случае кажетсякак я мог бы смоделировать Specifier как enum, но проблема в том, что я не могу инициализировать new Specifier().

Я мог бы также выразить все 100 перечислений в коде, но если только одно изменение в БД, мне нужно обновить мой код и перекомпилировать ...

Я мог бы знать, как public static final поля внутри спецификатора - какой вариант, но не уверен, что это хуже, чем enum подход?

Я мог бы enum реализовать интерфейс, но это кажется слишком неуклюжим.

Есть еще какие-нибудь мысли по этому поводу?

ОБНОВЛЕНИЕ

На данный момент кажется, что эта реализация с flyweight выглядит лучше (поскольку я также могу использовать == вместо equals)

public class Specifier {
  private static final Map<String, Specifier> flyweights = new HashMap<>();

  public static final Specifier KNOWN1 = Specifier.of("1");
  public static final Specifier KNOWN2 = Specifier.of("2");
  public static final Specifier KNOWN3 = Specifier.of("3");

  static {
        flyweights.put(KNOWN1.value(), KNOWN1);
        flyweights.put(KNOWN2.value(), KNOWN2);
        flyweights.put(KNOWN3.value(), KNOWN3);
  }

  private final String value;

  public static Specifier of(String value) {
    return flyweights.computeIfAbsent(value, v -> new Specifier(value));
  }
}
...