Los atributos de enumeración de Java devuelven nulo según el orden de acceso

Estaba explorando enums en Java para ver cómo se podían abusar y me encontré con un comportamiento que no podía explicar. Considere la siguiente clase:

public class PROGRAM {

public enum ENUM {;
    public enum ANIMALS {;
        public enum CATS {
            FELIX(DOGS.AKAME),
            GARFIELD(DOGS.WEED),
            BUBSY(DOGS.GIN);

            CATS(DOGS dog) {this.RIVAL = dog;}
            public DOGS RIVAL;
        }           
        public enum DOGS {
            GIN(CATS.FELIX), WEED(CATS.BUBSY), AKAME(CATS.GARFIELD);

            DOGS(CATS cat) {this.RIVAL = cat;}
            public CATS RIVAL;
        }
    }
}


public static void main(String[] args) {
    System.out.println(ENUM.ANIMALS.CATS.GARFIELD.RIVAL);
    System.out.println(ENUM.ANIMALS.DOGS.GIN.RIVAL);
}
}

La primera instrucción en la función principal imprimirá 'WEED', como se esperaba. El segundo imprimirá 'nulo'. Sin embargo, si los cambia, es decir,

    System.out.println(ENUM.ANIMALS.DOGS.GIN.RIVAL);
    System.out.println(ENUM.ANIMALS.CATS.GARFIELD.RIVAL);

la primera instrucción imprimirá 'FELIX' y la segunda instrucción imprimirá ahora 'nulo'. ¿Hay alguien que pueda explicar este fenómeno?

Como referencia, estoy ejecutando el Java (TM) SE Runtime Environment (build 1.8.0_05-b13)

Respuestas a la pregunta(2)

Su respuesta a la pregunta