Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:更好地理解enum_Java_Hibernate_Enums - Fatal编程技术网

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”