此声明之间是否有任何区别
Thread.State state = Thread.State.NEW;
那个
Enum<Thread.State> state = Thread.State.NEW;
在Java中?而不是第二个选项有点长?
答案 0 :(得分:14)
与比较之间的情况相同:
Child o = someChild;
和
Parent o = someChild;
Enum
是所有枚举类型的父类。因此,对于第二行,代码不能包含对Thread.State
的特定成员的引用,特别是this section of the language spec中描述的成员。
答案 1 :(得分:8)
有什么不同......
在实践中,在这种特殊情况下,可能没有。
理论上,Thread.State
是Enum<Thread.State>
的子类型。如果Thread.State
声明(非私有)字段或方法,则可以通过state
的第一个声明使用它们,但不能使用第二个声明。
一般来说,第一种形式更可取......因此。
此外,我认为您无法通过第二个声明中声明的变量看到枚举的static
方法values()
和valueOf
; e.g。
state.valueOf("BLOCKED")
但是,通过实例引用调用静态方法是错误的样式。
答案 2 :(得分:3)
浮现在脑海中的两个实际差异(与语言律师相反):
state
声明为Enum<Thread.State>
,那么您将无法将其传递给任何期望Thread.State
的方法。state
声明为Enum<Thread.State>
,那么您将离开读者 - 将来需要触摸此代码的人 - 想知道为什么你这样编写它。这些都不是一个非常深刻的原因;我们很容易想象一个平行的宇宙,其中大多数人使用Enum<Thread.State>
而不是Thread.State
,就像(在我们的宇宙中)大多数人使用List<...>
而不是ArrayList<...>
(如果可能的话) 。但是,由于大多数人不在我们的宇宙中这样做,所以最好只遵循常见模式,以尽量减少混淆和意外不兼容的风险。
顺便提一下,如果这是你的下一个问题。 。 。 使用Enum
的主要情况是,当您想要编写适用于许多不同枚举类型的通用内容时。 JDK中的一个示例是EnumMap<K extends Enum<K>,V>
,它是一种特殊的地图实现,通过知道其键是枚举值来获得空间和性能优势。
(顺便提一下,你无法写EnumMap<Enum<Thread.State>, String>
,因为Enum<Thread.State>
不会延伸Enum<Enum<Thread.State>>
。相反,你必须写EnumMap<Thread.State, String>
。所以这是我上面提到的差异#1的示例:如果您将state
声明为Enum<Thread.State>
,那么您就不能将其用作枚举图中的一个键。)