【发布时间】:2018-12-05 09:03:32
【问题描述】:
我有一个当前状态,其中 enum MyType 表示类型表,其列为:
ID
Name
它用于通过byId方法使用ID参数来识别类型:
public enum MyType {
FIRST_TYPE("First Type", 10),
SECOND_TYPE("Second Type", 20);
public static class Holder {
static Map<Integer, MyType > idMap = new HashMap<>();
private Holder() { }
}
private MyType(String name, Integer id) {
this.name = name;
this.id = id;
Holder.idMap.put(id, this);
}
public String getName() {
return name;
}
public static MyType byId(Integer id) {
return Holder.idMap.get(id);
}
我的新要求是支持类型表中也存在值,我发现answers 用于动态枚举,但接受答案不是这样做
没有。枚举始终在编译时固定。您可以做到这一点的唯一方法是动态生成相关的字节码。
对于还从数据库(例如 ID 30)中查找值(主要是 ID)有什么更好的解决方案
select ID from TYPE
我可以扩展现有状态而不是改变它吗?我可以使用方法从数据库中添加额外的 IDS 吗?
编辑
即使我更新为@StefanFischer 建议使用枚举类和新数据库类填充映射的接口,我仍然希望在代码中通过byId 方法返回枚举,
public interface MyType {
public static class Holder {
static Map<Integer, MyType> idMap = new HashMap<>();
private Holder() { }
}
public default void add(MyType myType, Integer id) {
Holder.idMap.put(id, myType);
}
public static MyType byId(Integer id) {
return Holder.idMap.get(id);
}
}
【问题讨论】:
-
枚举不适合动态值。您应该使用 this 的类和对象来表示数据库条目。
-
@markusw 你能建议添加扩展现有状态而不是改变它的类吗?
-
您不能扩展枚举。实际上它只是不适合这个任务。您应该放弃此解决方案并创建一个提供完全相同接口和名称的类。因此客户端代码不需要被触及。
-
我猜“问题”是关于这个的:“我的新要求是支持类型表中也存在值”但我不明白。这是否意味着你想在某处创建一个“exists(...)”方法来检查类型表中是否存在一个类型?这种方法会有一些限制吗?
-
这个问题显然受到XY problem的影响。请先查看您的问题,然后找到合适的技术解决方案。你反过来做:你坚持一个解决方案,无论多么不适合这个问题。鉴于作者拥有 26k 的声誉,这令人难以置信。枚举在设计上不是动态的,这是它们的主要功能之一(不是不必要的限制)。
标签: java enums database-driven