猿问

Java 枚举值字段在定义之外不可访问

在下面的代码中,枚举值的成员字段在枚举定义之外不可访问:ColoursGREEN


public class Test {


    enum Colours {

        RED,

        GREEN {

            public static final int hex = 0x00ff00;

            public final int hex2 = 0x00ff00;  // Try it without static, just in case...


            void f() {

                System.out.println(hex);    // OK

                System.out.println(hex2);   // OK

            }

        },

        BLUE

    }


    public static void main(String[] args) {

        System.out.println(Colours.GREEN.hex);      // COMPILE ERROR

        System.out.println(Colours.GREEN.hex2);     // COMPILE ERROR

    }

}

有问题的行会导致以下编译器错误:


Error:(38, 41) java: cannot find symbol

  symbol:   variable hex

  location: variable GREEN of type Test.Colours

任何想法为什么这不起作用?我假设Java标准禁止它,但为什么呢?


翻过高山走不出你
浏览 218回答 2
2回答

PIPIONE

根据 JLS §8.9.1。枚举常量 常量 主体受适用于匿名类的规则的约束,这些规则限制了字段和方法的可访问性:enum枚举常量的可选类体隐式定义了一个匿名类声明 (§15.9.5),该声明扩展了立即封闭的枚举类型。类体由匿名类的通常规则管理;特别是它不能包含任何构造函数。只有在封闭枚举类型 (§8.4.8) 中声明的实例方法覆盖封闭枚举类型中的可访问方法时,才能在封闭枚举类型之外调用这些实例方法。

互换的青春

enum Colours {    RED,    GREEN {        public static final int hex = 0x00ff00;        public final int hex2 = 0x00ff00;  // Try it without static, just in case...        void f() {            System.out.println(hex);    // OK            System.out.println(hex2);   // OK        }    },    BLUE}在这里,和 都是 类型,不知道 , 或者 ,这就是你的代码无法编译的原因。REDGREENBLUEColourshexhex2f您可以做的是在枚举定义中移动它们:enum Colours {    RED(0xff0000, 0xff0000),    GREEN(0x00ff00, 0x00ff00),    BLUE(0x0000ff, 0x0000ff);    final int hex;    final int hex2;     Colours(int hex, int hex2) {        this.hex = hex;        this.hex2 = hex2;    }    void f() {        System.out.println(hex);    // OK        System.out.println(hex2);   // OK    }}这样,所有这些将编译:System.out.println(Colours.GREEN.hex);System.out.println(Colours.GREEN.hex2);Colours.GREEN.f();
随时随地看视频慕课网APP

相关分类

Java
我要回答