Java 部分枚举模型
假设我有一个名为Java 部分枚举模型,java,oop,enums,software-design,Java,Oop,Enums,Software Design,假设我有一个名为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
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;
在这种情况下,我似乎可以将说明符
建模为枚举
,但问题是我无法初始化新说明符()
我也可以在代码中表示所有100个枚举,但如果数据库中只有一个更改,我需要更新代码并重新编译
我可以在说明符中称为publicstaticfinal
字段-这是一个选项,但不确定这是否不如enum
方法
我可以用enum
实现一个接口,但这似乎太笨拙了
关于这一点还有其他想法吗?似乎这个带有flyweight的实现看起来是最好的(因为我也可以使用=
而不是equals
)
公共类说明符{
private static final Map flyweights=new HashMap();
公共静态最终说明符KNOWN1=说明符(1);
公共静态最终说明符KNOWN2=说明符(共“2”);
公共静态最终说明符KNOWN3=说明符(“3”);
静止的{
flyweights.put(KNOWN1.value(),KNOWN1);
flyweights.put(KNOWN2.value(),KNOWN2);
flyweights.put(KNOWN3.value(),KNOWN3);
}
私有最终字符串值;
的公共静态说明符(字符串值){
返回flyweights.computeIfAbsent(值,v->新说明符(值));
}
}
您的目标是什么。是否有一个类可以使用==
或其他方法进行比较?此外,是否需要能够使用new
获取实例?如果是,为什么?是的。假设我反序列化消息,其中说明符可以是100个cese中的任意一个。然后我比较它,只有当它等于说明符时,我才做一些逻辑。否则我只是重新序列化并转发。要点是能够与=
进行比较,并使其具有与相等的比较相同的“语义”吗?在这种情况下,我认为除了使用一个具有正确实现的.equals
方法的常规类之外,没有太多的理由支持使用其他类。正如您所说,KNOWN
可以是一个静态final
变量。确保使用KNOWN.equals(other)
而不是KNOWN==other
检查是否相等。任何使用枚举的解决方案,或任何更复杂的解决方案,都会涉及到您跳出障碍使其工作(例如,绕过nonew
),而且从声音上看,除了构造和平等性检查之外,您没有任何要求。
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));
}
}