Los campos de valores de enumeración de Java no son accesibles fuera de la definición

En el siguiente código, los campos miembros del valor de Coloursenumeración GREENno son accesibles fuera de la definición de enumeración:

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

Las líneas ofensivas dan lugar al siguiente error del compilador:

Error:(38, 41) java: cannot find symbol
  symbol:   variable hex
  location: variable GREEN of type Test.Colours

¿Alguna idea de por qué esto no funciona? Supongo que el estándar Java lo prohíbe, pero ¿por qué?

Respuesta 1

Según JLS §8.9.1. Enum Constants, un enumcuerpo constante se rige por las reglas aplicables a la clase anónima, que restringen la accesibilidad de los campos y métodos:

El cuerpo de clase opcional de una constante enum define implícitamente una declaración de clase anónima (§15.9.5) que extiende el tipo de enumeración que encierra inmediatamente. El cuerpo de la clase se rige por las reglas habituales de las clases anónimas; en particular no puede contener ningún constructor. Los métodos de instancia declarados en estos cuerpos de clase pueden invocarse fuera del tipo de enumeración adjunto solo si anulan los métodos accesibles en el tipo de enumeración adjunto (§8.4.8).

Respuesta: 2

Estoy integrando Weld 3.1.0 en mi aplicación. Mi aplicación ya tiene una dependencia con la biblioteca de API de anotación Javax. Me di cuenta de que la implementación de soldadura (Core) define una dependencia ...

Estoy tratando de descubrir cómo usar la entrada y salida de los usuarios de cierta información dependiendo de la entrada del usuario. ¿Alguien puede proporcionar un ejemplo simple del uso del patrón decorador para una pizza simple ...

Tengo tres proyectos de gradle. Diga ProjectA, ProjectB y ProjectC. ProjectC depende de ProjectA y ProjectB. Mientras que ProjectB depende de ProjectA. Entonces, build.gradle de ProjectC tiene el ...

public class POSToolBar extiende JFrame {/ ** * Inicie la aplicación. * / private BrowserToolBar toolBar; public POSToolBar () {super ("POS"); Contenido del contenedor = getContentPane (); ...