【问题标题】:Java Enum<T> vs T as variable typeJava Enum<T> vs T 作为变量类型
【发布时间】:2017-07-16 06:50:56
【问题描述】:

这个声明有什么区别

Thread.State state = Thread.State.NEW;

还有那个

Enum<Thread.State> state = Thread.State.NEW;

在 Java 中?而不是第二个选项长一点?

【问题讨论】:

  • 例如,AbstractList 和 ArrayList 之间存在相同的差异。如果您需要访问特定于 ArrayList 且不在 AbstractList 中的成员,则需要将您的变量声明为 ArrayList。这里的第一个更简洁、更清晰、更惯用。使用超类不会获得任何好处,因为无论如何都不会有 Enum 的任何其他子类。

标签: java generics enums difference


【解决方案1】:

与比较的情况相同:

Child o = someChild;

Parent o = someChild;

Enum 是所有枚举类型的父类。因此,第二行代码不能包含对Thread.State的特定成员的引用,特别是this section of the language spec中描述的成员。

【讨论】:

    【解决方案2】:

    有什么区别吗....

    实际上,在这种特殊情况下,可能不会。

    理论上,Thread.StateEnum&lt;Thread.State&gt; 的子类型。如果Thread.State 声明(非私有)字段或方法,那么您可以通过state 的第一个声明使用它们,但不能通过第二个声明。

    一般来说,第一种形式更可取……因此。


    另外,我认为您无法通过第二个声明中声明的变量看到枚举的static 方法values()valueOf;例如

    state.valueOf("BLOCKED")
    

    但是,通过实例引用调用静态方法是不好的风格。

    【讨论】:

      【解决方案3】:

      想到的两个实际差异(相对于语言-律师的原因):

      1. 如果您将state 声明为Enum&lt;Thread.State&gt;,那么您将无法将其传递给任何需要Thread.State 的方法。
      2. 如果您将 state 声明为 Enum&lt;Thread.State&gt;,您会让读者(无论将来需要接触此代码的人)想知道您为什么要这样写。

      这些都不是一个非常深刻的原因;我们可以很容易地想象一个平行宇宙,其中大多数人使用Enum&lt;Thread.State&gt; 而不是Thread.State,就像(在我们的宇宙中)大多数人使用List&lt;...&gt; 而不是ArrayList&lt;...&gt;(如果可能)。但由于大多数人不会在我们的宇宙中这样做,因此您最好遵循通用模式,以最大程度地减少混淆和意外不兼容的风险。


      顺便说一句,如果这将是您的下一个问题。 . .您使用Enum 的主要情况是当您想要编写适用于许多不同枚举类型的通用内容时。 JDK 中的一个示例是 EnumMap&lt;K extends Enum&lt;K&gt;,V&gt;,它是一种特殊的映射实现,通过知道它的键是枚举值来获得空间和性能优势。

      (顺便提一下,你不能EnumMap&lt;Enum&lt;Thread.State&gt;, String&gt;,因为Enum&lt;Thread.State&gt;不扩展Enum&lt;Enum&lt;Thread.State&gt;&gt;。相反,你必须EnumMap&lt;Thread.State, String&gt;。所以这是我上面提到的差异 #1 的示例:如果您将 state 声明为 Enum&lt;Thread.State&gt;,那么您不能将其用作枚举映射中的键。)

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 2018-08-23
        • 2015-06-24
        • 2020-08-22
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 2021-08-31
        • 2013-09-15
        相关资源
        最近更新 更多