Java的枚举工具提供的语法糖有时可能会有点混乱.考虑这个例子,没有编译:
public enum TestEnum { FOO("foo") { public void foo() { helper(); // <- compiler error } }; String name; TestEnum(String name) { this.name = name; } public abstract void foo(); private void helper(){ // do stuff (using this.name,so must not be static) } }@H_502_4@任何人都可以解释为什么编译器说
@H_502_4@Non-static method ‘helper()’ cannot be referenced from a static context@H_502_4@这个上下文如何静态? @H_502_4@您可以通过更改对this.helper()的调用来进行编译(这里有一个令人困惑的观点:如果我们真的处于编译器建议的“静态上下文”中,那么“这个”如何工作?)或者增加可见性的帮助()到默认级别.你更喜欢哪个?另外,请随便提出一个更好的问题标题:-) @H_502_4@编辑:我发现some discussion about this – 但没有真正的答案.我的同事认为,this.helper()的作用实际上是一个编译器错误.确实使用较新的Java版本似乎不起作用(尽管super.helper()):“找不到符号帮助()”. (虽然有一些奇怪的事情:在尝试使用不同的Java版本后,我无法让这个.helper()重新编译,其中任何一个…)
解决方法
错误消息是误导性的,只是让帮助者保护并且它将工作.
protected void helper(){ // can be called from subclasses (such as FOO) since it is not private }