Java:更好地理解enum
请帮助我更好地理解这个枚举类Java:更好地理解enum,java,hibernate,enums,Java,Hibernate,Enums,请帮助我更好地理解这个枚举类 public enum TryMe { A("A", "Description of A"), B("B", "Description of B"); private String a; private String b; private TryMe(String a, String b) { this.a = a; this.b = b; } //Getter and
public enum TryMe {
A("A", "Description of A"),
B("B", "Description of B");
private String a;
private String b;
private TryMe(String a, String b) {
this.a = a;
this.b = b;
}
//Getter and Setter for 'a' and 'b'
}
在Hibernate实体类中包含时会发生什么
实体类对应的数据库列需要一个值为“a”或“B”的字符串
如何传递字符串值?不会传递字符串值,只传递成员的名称。 因为这是一个固定成员,所以您总是可以通过枚举的键或索引获取该值,然后获取字符串值
参见jpa的注释 任何枚举都可以通过其名称进行唯一标识。在您的例子中,
A
和B
这两个常量名称由Java编译器编译为静态
字段,其中每个字段都包含枚举类型的实例。这样,枚举实例在整个应用程序(或者更确切地说,类加载器)中是唯一的。即使有反射,也不可能在任何时间点改变这些字段
因此,Hibernate无法序列化枚举,也无法在枚举中保留状态更改(无论如何都应该避免)。它们只能被引用,Hibernate就是这样做的:
- 通过它们的常量名称(
,A
)B
- 按顺序(
,0
)1
A
之前声明了B
,则所有数据库表示都将被关闭。这很可能会破坏您的应用程序,因此建议使用第一种存储方法
从Hibernate加载值时,它将返回enum类中名为a
或B
的字段的值。如果您的JVM实例在此期间重新启动,那么由于这个原因,对枚举字段的任何更改都将丢失
如果你仔细想想,这也很有道理。任何枚举状态都是全局的,您无法保存不同的状态(例如
a
),并且一旦从数据库加载两个不同的值,它将在不同的状态中表示两次。这将打破enum的独特性契约。不,没有setter。你应该明确地宣布‘a’和‘b’为‘最终’!从技术上讲,枚举构造函数中不需要private
关键字-所有枚举构造函数都是隐式的private
,如果试图将它们声明为其他类型,则编译器会出错。不管你是否包括它实际上取决于个人喜好,我知道有些人喜欢它。当使用Enum代替标准的单例模式时,它也非常有用@参见Josh Bloch的“高效Java”