【问题标题】:What are the drawbacks of enums in Java?Java中枚举的缺点是什么?
【发布时间】:2019-07-16 16:52:36
【问题描述】:

在查看 jhipster 时,我偶然发现了以下课程

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
}

使用枚举有什么缺点吗?

【问题讨论】:

  • 并非如此。他们还可以使用枚举并向其添加一个字符串字段,实际上具有相同的功能。 (枚举就像类,你可以给它们添加方法和字段)
  • 是否有可能添加您自己的权限?如果是这样,它就不可能是一个枚举。
  • 一些 Spring 注释类被设计为接受 Strings 作为它们的值,而不是 Enums。也许是这样
  • @NikolayShevchenko 你总是可以使用name() 来获得Enum 元素的字符串表示,所以这并不是什么大问题。
  • @PiotrWilkin 你错了。在注解中使用.name() 会失败,并出现编译时错误attribute value must be constant。您可以在此处查看示例stackoverflow.com/q/28031784/2224047

标签: java enums jhipster


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    1. 它很像类,它扩展 java.lang.Enum 所以你不能扩展 其他枚举。另一个潜在的问题是你不相处 JSP 中的表达式语言 (EL)。

    2.有些事情可以在普通课堂上完成,但也许你可以 与枚举类无关,因为它是一个特殊的类。例如, 访问构造函数中无法使用的静态字段 枚举。

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

    这些是主要缺点。

    .

    【讨论】:

      【解决方案3】:

      如果一个值实际上只是作为字符串引用,那么为了简单起见,我会将其保留为字符串常量。

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

      如果您需要更改字符串常量的值,只需一行更改。使用枚举时,由于 name 和 toString 具有不同的值,并且这些值可能在条件逻辑中使用,它可能会变得更加复杂。

      【讨论】:

        猜你喜欢
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2013-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多