java – 静态上下文在枚举定义中

前端之家收集整理的这篇文章主要介绍了java – 静态上下文在枚举定义中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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_404_3@ 
 

任何人都可以解释为什么编译器说

Non-static method ‘helper()’ cannot be referenced from a static context

这个上下文如何静态?

您可以通过更改对this.helper()的调用来进行编译(这里有一个令人困惑的观点:如果我们真的处于编译器建议的“静态上下文”中,那么“这个”如何工作?)或者增加可见性的帮助()到默认级别.你更喜欢哪个?另外,请随便提出一个更好的问题标题:-)

编辑:我发现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
}@H_404_3@

猜你在找的Java相关文章