gpt4 book ai didi

Java:更好地理解枚举

转载 作者:行者123 更新时间:2023-11-30 09:06:31 24 4
gpt4 key购买 nike

请帮助我更好地理解这个枚举类。

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”的字符串。
如何只传递字符串值?

最佳答案

任何枚举都可以通过其名称进行唯一标识。这些常量名称,在您的例子中,AB,被 Java 编译器编译为 static 字段,其中每个字段包含一个实例枚举类型。这样,枚举实例在整个应用程序(或更准确地说,类加载器)中是唯一的。不可能在任何时间点更改这些字段,即使使用反射也是如此。

因此,枚举不能被 Hibernate 序列化,并且不可能在枚举中持久化状态更改(无论如何你应该避免。)它们只能被引用,这正是 Hibernate 所做的。 Hibernate / JPA stores enums therefore as either :

  • 通过它们的常量名称(AB)
  • 按顺序(0, 1)

后一种方法的问题在于,您无法在不破坏存储值的情况下更改常量值的顺序。如果您在 A 之前声明了 B,您所有的数据库表示都将被关闭。这很可能会破坏您的应用程序,因此建议使用第一种存储方法。

当从 Hibernate 加载一个值时,它将返回枚举类中名为 AB 的字段的值。如果您的 JVM 实例确实同时重新启动,那么对枚举字段的任何更改都会因此丢失。

如果您考虑一下,这也是非常有道理的。任何枚举状态都是全局的,您无法为例如 A 保存不同的状态,并期望一旦您从数据库加载两个不同的值,它就会以不同的状态表示两次。这会破坏枚举的唯一性。

关于Java:更好地理解枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24411535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com