In Java, i tipi enum all'interno di una classe sono statici?


123

Non riesco ad accedere ai membri dell'istanza della classe circostante dall'interno di un enum, come potrei dall'interno di una classe interna. Significa che le enumerazioni sono statiche? Esiste un accesso all'ambito dell'istanza della classe circostante o devo passare l'istanza nel metodo enum dove ne ho bisogno?

public class Universe {
    public final int theAnswer;

    public enum Planet {
        // ...
        EARTH(...);
        // ...

        // ... constructor etc.

        public int deepThought() {
            // -> "No enclosing instance of type 'Universe' is accessible in this scope"
            return Universe.this.theAnswer;
        }
    }

    public Universe(int locallyUniversalAnswer) {
        this.theAnswer = locallyUniversalAnswer;
    }
}

Non sono sicuro di aver capito completamente cosa stai cercando di descrivere. puoi dare un piccolo esempio di codice forse?
Pete

Risposte:


176

Sì, le enumerazioni annidate sono implicitamente statiche.

Dalla sezione di specifica della lingua 8.9 :

I tipi di enumerazione annidati sono implicitamente statici. È consentito dichiarare esplicitamente statico un tipo enum annidato.


45

Non avrebbe senso creare una classe enum interna a livello di istanza (non statica) - se le istanze di enum fossero esse stesse legate alla classe esterna, infrangerebbero la garanzia enum -

ad es. se lo avessi

public class Foo {
   private enum Bar {
        A, B, C;
   } 
}

Affinché i valori enum agiscano correttamente come costanti, (psuedocode, ignorando le restrizioni di accesso)

Bar b1 = new Foo().A
Bar b2 = new Foo().A

b1 e b2 dovrebbero essere gli stessi oggetti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.