所以我有我的枚举
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
"字段"的类型ValueA是Sample.这意味着您只能调用ValueA该Sample提供的方法.来自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)