Java 中枚举的缺点是什么?

What are the drawbacks of enums in Java?

在查看 jhipster 时,我偶然发现了以下内容 class

public final class AuthoritiesConstants {
    public static final String ADMIN = "ROLE_ADMIN";
    public static final String USER = "ROLE_USER";
    public static final String ANONYMOUS = "ROLE_ANONYMOUS";
    private AuthoritiesConstants() {
    }
}

我想知道为什么他们不使用枚举,例如

public enum AuthoritiesConstants {
    ROLE_ADMIN,
    ROLE_RESPONSABLE,
    ROLE_MANAGER,
    ROLE_COLLABORATEUR
}

使用枚举有什么缺点吗?

一个可能的答案是枚举是在 Java 1.5 中引入的。虽然这看起来像是古老的历史,但出于兼容性原因,一些库仍然使用字符串常量或数字常量。

另一个可能的答案是,这些在语义上并不是真正的枚举元素,而是外部接口使用的常量,并且只能通过它们的字符串值访问。在这种情况下,每次使用枚举并调用 name() 都是多余的。

除此之外,在这种情况下,您不应该在字符串常量上使用枚举。

1. 很像 class 它是扩展 java.lang.Enum 所以你不能扩展 其他枚举。另一个潜在的问题是你不相处 JSP.

中的表达语言 (EL)

2. 有些事情可以在正常 classes 中完成,但也许你可以 不要使用枚举 class 因为它是一个特殊的 class。例如, 访问构造函数中无法使用的静态字段 枚举。

3. 当您使用 JSP 时,您既不能访问枚举,也不能访问枚举
调用枚举常量因为它不受支持(这是可能的 EL 版本 3.0 之后)

这些是主要缺点。

.

如果一个值只是真正意味着作为字符串引用,那么为了简单起见,我会将其保留为字符串常量。

枚举比具有附加功能和细微差别的字符串常量更复杂。查看 this 关于枚举的 toStringname 方法之间区别的问题。

如果您需要更改字符串常量的值,那就是 one-line 更改。使用枚举会变得更加复杂,因为名称和 toString 具有单独的值,并且这些值可能用于条件逻辑。