建模部分枚举
Modelling partial enumeration
假设我有一个名为 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));
}
}
假设我有一个名为 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));
}
}