【问题标题】:Why Groovy Enums has no access to class variables?为什么 Groovy Enums 无法访问类变量?
【发布时间】:2016-01-10 14:22:09
【问题描述】:

找不到任何文档来解释为什么无法从枚举中访问类变量。考虑这个例子:

package groovy;

public class Universe {

    static String test = "test";

    enum Planet {

        EARTH {
            @Override
            void doSomething(){
                System.out.print(test);
            }
        };

        abstract void doSomething();
    }

    public static void main(String[] args) {
        Universe.Planet.EARTH.doSomething(); // No such property: test for class: groovy.Universe$Planet$1
    }
}

我知道这段代码也是完美的 Java 代码。虽然它使用 JRE 可以按预期工作,但不能使用 Groovy 的运行时环境,这让我更加好奇。有什么不同的证据吗?谢谢

【问题讨论】:

  • 这听起来像一个错误。如果你使用@CompileStatic会发生什么?
  • groovy 不是完美的java,还是有区别的。

标签: java groovy enums static-members class-variables


【解决方案1】:

Groovy 需要一些帮助才能找到 Universe 的变量。如果您想了解 Java 和 Groovy 之间的一些差异,这里有一个指向 official documentation 的链接。这是一个email discussion,涉及到这一点。对于不熟悉枚举的人来说,它们是静态对象,因此不能访问实例对象或变量。这就引出了我们的答案,静态变量需要以静态方式引用(通过类,而不是实例)。
此外,如果您尝试在 Groovy 1.7 之前使用内部类,您将会遇到麻烦(您不能这样做)。

public class Universe {

static String test = "testing";

enum Planet {

    EARTH {
        @Override
        void doSomething(){
            System.out.print(Universe.test);
        }
    };

    abstract void doSomething();
}

public static void main(String[] args) {
    Universe.Planet.EARTH.doSomething(); // No such property: test for class: groovy.Universe$Planet$1
}
}

【讨论】:

  • 枚举 instances 是静态对象,但它们可以有实例状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 2020-05-06
相关资源
最近更新 更多