Java public enum方法的目的

Sig*_*ign 11 java enums

所以我有我的枚举

public enum Sample {
   ValueA{
      @Override
   public String getValue(){ return "A"; }   
 },
 ValueB{
    @Override
   public String getValue(){ return "B"; }

   public void doSomething(){ }
 };
abstract public String getValue();
};
Run Code Online (Sandbox Code Playgroud)

我有一些其他代码试图使用枚举.

Sample.ValueB.doSomething();
Run Code Online (Sandbox Code Playgroud)

这似乎应该是有效的,但产生错误"方法doSomething()未定义类型Sample".相反

Sample value = Sample.ValueB;
value.doSomething();
Run Code Online (Sandbox Code Playgroud)

产生相同的错误,似乎合理.

我假设有一个合理的答案,为什么第一个不起作用,它涉及两个例子在引擎盖下等效.我希望有人能指出我为什么会那样的文件.

Joa*_*uer 15

"字段"的类型ValueASample.这意味着您只能调用ValueASample提供的方法.来自JLS§8.9.1.枚举常数:

只有当它们覆盖封闭枚举类型中的可访问方法时,才可以在封闭枚举类型之外调用在这些类主体中声明的实例方法.

更重要的是:从设计的角度来看,enum值应该是统一的:如果某个特定值可以进行某些操作,则应该可以使用所有值(尽管可能导致执行不同的代码).


Jon*_*eet 10

基本上,编译时类型Sample.ValueB仍是样品,即使执行时间值的类型将是ValueB.因此,您的两个代码片段是等效的 - 客户端无法看到仅在您的某些枚举值中出现的"额外"方法.

您可以有效地将枚举视为声明这样的字段:

public static final Sample ValueB = new Sample() {
    @Override
    public String getValue(){ return "B"; }

    public void doSomething(){ }
};
Run Code Online (Sandbox Code Playgroud)