Le istanze di enumerazione sono statiche per impostazione predefinita?

enum Animals{ DOG("woof"), CAT("Meow"), FISH("Burble"); String sound; Animals(String s) { sound = s; } } public class TestEnum{ static Animals a; public static void main(String ab[]){ System.out.println( a ); System.out.println( a.DOG.sound + " " + a.FISH.sound); } } 

Nell’esempio sopra, perché siamo in grado di accedere alle istanze dell’enum (ad es. Come a.DOG.sound) quando a è null e enum non è dichiarato statico? Le istanze enum sono statiche per impostazione predefinita?

Le enumerazioni sono implicitamente public static final .

È ansible fare riferimento a a.DOG perché è ansible accedere ai membri statici tramite riferimenti di istanza, anche se null: la risoluzione statica utilizza il tipo di riferimento, non l’istanza.

Non lo farei ; è fuorviante: la convenzione favorisce i riferimenti statici di tipo (non istanza).

Vedi JLS 6.5.6.2 riguardante la variabile di class tramite istanze. Vedi JLS 15.11 per il motivo per cui funziona ancora con un null . Nutshell: è il tipo di riferimento, non l’istanza, attraverso la quale vengono risolte le statiche.


Link aggiornati: /

JSE 6

  • JLS 6.5.6.2 riguardante l’accesso alle variabili di class tramite nome di espressione
  • JLS 15.11 riguardante l’accesso statico al campo tramite riferimenti null

JSE 7

  • JLS 6.5.6.2 riguardante l’accesso alle variabili di class tramite nome di espressione
  • JLS 15.11 riguardante l’accesso statico al campo tramite riferimenti null

JSE 8

  • JLS 6.5.6.2 riguardante l’accesso alle variabili di class tramite nome di espressione
  • JLS 15.11 riguardante l’accesso statico al campo tramite riferimenti null

Sì, le enumerazioni sono effettivamente statiche.