Допустим, у меня есть поле с именем 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));
}
}