我有一个当前状态,其中enumMyType表示类型表,其列为:
enum
ID Name
并使用ID参数和byId方法来识别类型:
byId
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); }
我的新要求是支持Type表中还存在值,我找到了动态枚举的答案,但是接受答案不是这样做
否。枚举始终固定在编译时。您执行此操作的唯一方法是动态生成相关的字节码。
从数据库(例如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); } }
如果我正确理解的要求是:
Type
因此,枚举不能动态扩展,但是我们可以切换到一个类。
因此,紧贴您的代码可以编写如下代码:
import java.util.HashMap; import java.util.Map; public class MyType { static Map<Integer, MyType> idMap = new HashMap<>(); static { idMap.put(10, new MyType("First Type")); idMap.put(20, new MyType("Second Type")); } private final String name; private MyType(String name) { this.name = name; } public String getName() { return name; } public static MyType byId(Integer id) { return idMap.get(id); } public static void addType(String name, Integer id) { MyType lookup = byId(id); if(lookup != null) { if(!lookup.getName().equals(name)) { System.out.println("conflicting redefinition for id " + id + ": '" + name + "' vs '" + lookup.name + "'"); //handle... } } idMap.put(id, new MyType(name)); } }
测试数据
假设数据库中包含以下内容:
stephan=# select * from Type; id | name ----+------------- 30 | Third Type 10 | First Type 20 | Second Type (3 rows)
因此,在数据库中,我们具有id = 10和id = 20的预定义类型,还有id = 30的类型,默认情况下应用程序不知道。但是我们可以从数据库中填充类型。
测试用例
public static void main(String[] args) { try { Connection connection = createConnection(); try (connection) { populateTypes(connection); } MyType type; type = MyType.byId(10); System.out.println(type.getName()); type = MyType.byId(20); System.out.println(type.getName()); type = MyType.byId(30); System.out.println(type.getName()); } catch (Exception e) { e.printStackTrace(); } }
JDBC示例
使用哪种实际的数据库技术来检索值都没有关系。这是JDBC的示例:
private static void populateTypes(Connection connection) throws SQLException { String sql = "SELECT * FROM type"; try (Statement st = connection.createStatement()) { try (ResultSet rs = st.executeQuery(sql)) { while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); MyType.addType(name, id); } } } }
演示输出
First Type Second Type Third Type
那是您要找的东西吗?