我有一个当前状态,其中enum
MyType表示类型表,其列为:
ID
Name
并使用ID参数和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
那是您要找的东西吗?
主要内容:声明常量,实例,VB.Net打印和显示常量,声明枚举,实例常量指的是程序在执行过程中可能不会改变的固定值。 这些固定值也被称为文字。 常量可以是任何基本数据类型,如整数常量,浮点常量,字符常量或字符串文字。 也有枚举常量。 常量的处理方式与常规变量一样,只是它们的值在定义之后无法修改。 枚举是一组命名的整数常量。 声明常量 在VB.Net中,使用语句声明常量。 语句用于模块,类,结构,过程或块级别,以代替文字值。 语句的语法是: 其中, attribut
问题内容: 通过阅读SCJP书籍,我在第1章“自测”中发现了类似的内容: 注意:代码编译正常。我不明白的是为什么我们可以从变量访问DOG,CAT或FISH常量。我认为(并且也写在书中)DOG,FISH,CAT是常量,其实现方式类似于。 所以,如果它们确实是静态的,为什么我们可以从中访问它们呢?最后一行是我熟悉的方式。 问题答案: 写作 和写作一样。也就是说,编译器将用其编译时类型Animal替换变
问题内容: 我正在查看公司其他部门维护的一些Java代码,顺便说一下,这是一些前C和C ++开发人员所维护的。普遍存在的一件事是使用静态整数常量,例如 除了缺少“最终”限定符外,这种代码也让我有些不安。我本来希望看到的是,从学校开始主要接受Java的培训,这会更像 但是,论点使我失望。为什么要比后者更好呢? 问题答案: 为什么要比后者更好呢? 这样做要好得多,因为它可以为您提供类型安全性并具有自记
问题内容: 除了简单地为每个枚举创建查找表(以Id,代码和名称作为列)之外,是否有更好或更简便的方法将枚举(在C#等编程语言中可用的枚举)存储在SQL Server数据库中,而不是为每个枚举创建查找表(尤其是在存在枚举时)每个表中只有很少的几行)?我发现有一篇文章建议只为所有枚举创建一个查找表,并且有人批评这种方法违反了引用数据的完整性,因此有人批评该方法。如果枚举仅由一个表使用,那么使用一些预定
问题内容: 我正在做一些实验,无意间写了一段代码,这很奇怪,我还没完全明白。我什至可以编译它,我什至感到惊讶。看起来像这样: 不出所料,无法通过以下方式访问此类元素: 原因是,编译器将在枚举本身内寻找该方法。 我以为不可能从枚举之外访问这些方法和变量。因此,我尝试创建一个参数构造函数,并使用一些内部变量进行调用: 不可能编译这样的构造。现在,我在想如果没有办法访问常量,那么在常量中定义某些东西有什