如果我正确理解的要求是:
- 具有提供一些预定义值的MyType.byId(Integer 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 TypeSecond TypeThird Type
那是您要找的东西吗?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)