为什么Groovy Enums无法访问类变量?

时间:2015-10-13 00:45:13

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

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

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的运行时环境,这让我更加好奇。有什么区别的证据吗?感谢

1 个答案:

答案 0 :(得分:3)

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