当前位置:  开发笔记 > 编程语言 > 正文

枚举定义中的静态上下文

如何解决《枚举定义中的静态上下文》经验,为你挑选了1个好方法。

Java enum设施提供的语法糖有时会有点混乱.考虑这个不编译的例子:

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)
    }
}

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

无法从静态上下文引用非静态方法'helper()'

这个上下文究竟是如何静态的?

你可以通过改变调用来进行编译(这里有一个令人困惑的地方:如果我们真的在编译器建议的"静态上下文"中," " 如何工作?)或者增加默认级别的可见性.你更喜欢哪个?另外,随意提出更好的问题标题:-)this.helper()thishelper()

编辑:我发现了一些关于此的讨论 - 但没有真正的答案.我的同事认为这样的事实this.helper()实际上是一个编译器错误.事实上,对于较新的Java版本,它似乎无法工作(尽管如此super.helper()):"找不到符号助手()".(虽然有一些奇怪的事情发生了:在尝试使用不同的Java版本后,我无法this.helper()再使用它们中的任何一个进行编译......)



1> akuhn..:

错误消息具有误导性,只需helper保护它就可以了.

protected void helper(){
    // can be called from subclasses (such as FOO) since it is not private
}

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有