2011-11-07 21 views
13

Sto solo ora realizzando il loro potere e utilità sull'uso di una classe Constants ... ma sono molto interessato a sapere come sono implementati sotto il cofano. Sembrano funzionare come un metodo statico o una costante statica in quanto si importa semplicemente il file che "possiede" l'enumerazione e si può fare riferimento ad essi usando enumName.valueName. I Javadoc online sembrano suggerire che siano uno class ma sembra strano avere una classe "senza nome" su richiesta. (In Java almeno ...)Come vengono implementate le enumerazioni in Java?

risposta

17

credo che ogni istanza dell'enum sia una sottoclasse finale anonima dell'enum.

decompilare:

public enum Color { 
    r(0xff0000), g(0x00ff00), b(0x0000ff); 
    Color(int rgb) { 
     this.rgb=rgb; 
    } 
    final int rgb; 
} 

e si possono vedere le istanze stati fatti:

D:\home\ray\dev\indigoapps\so8032067enumimpl\bin>javap -c Color 
Compiled from "Color.java" 
public final class Color extends java.lang.Enum{ 
public static final Color r; 

public static final Color g; 

public static final Color b; 

final int rgb; 

static {}; 
    Code: 
    0: new  #1; //class Color 
    3: dup 
    4: ldc  #16; //String r 
    6: iconst_0 
    7: ldc  #17; //int 16711680 
    9: invokespecial #18; //Method "<init>":(Ljava/lang/String;II)V 
    12: putstatic  #22; //Field r:LColor; 
    15: new  #1; //class Color 
    18: dup 
    19: ldc  #24; //String g 
    21: iconst_1 
    22: ldc  #25; //int 65280 
    24: invokespecial #18; //Method "<init>":(Ljava/lang/String;II)V 
    27: putstatic  #26; //Field g:LColor; 
    30: new  #1; //class Color 
    33: dup 
    34: ldc  #28; //String b 
    36: iconst_2 
    37: sipush 255 
    40: invokespecial #18; //Method "<init>":(Ljava/lang/String;II)V 
    43: putstatic  #29; //Field b:LColor; 
    46: iconst_3 
    47: anewarray  #1; //class Color 
    50: dup 
    51: iconst_0 
    52: getstatic  #22; //Field r:LColor; 
    55: aastore 
    56: dup 
    57: iconst_1 
    58: getstatic  #26; //Field g:LColor; 
    61: aastore 
    62: dup 
    63: iconst_2 
    64: getstatic  #29; //Field b:LColor; 
    67: aastore 
    68: putstatic  #31; //Field ENUM$VALUES:[LColor; 
    71: return 

public static Color[] values(); 
    Code: 
    0: getstatic  #31; //Field ENUM$VALUES:[LColor; 
    3: dup 
    4: astore_0 
    5: iconst_0 
    6: aload_0 
    7: arraylength 
    8: dup 
    9: istore_1 
    10: anewarray  #1; //class Color 
    13: dup 
    14: astore_2 
    15: iconst_0 
    16: iload_1 
    17: invokestatic #43; //Method java/lang/System.arraycopy:(Ljava/lang/Obj 
ect;ILjava/lang/Object;II)V 
    20: aload_2 
    21: areturn 

public static Color valueOf(java.lang.String); 
    Code: 
    0: ldc  #1; //class Color 
    2: aload_0 
    3: invokestatic #51; //Method java/lang/Enum.valueOf:(Ljava/lang/Class;L 
java/lang/String;)Ljava/lang/Enum; 
    6: checkcast  #1; //class Color 
    9: areturn 

} 
+2

Si dovrebbero ottenere solo classi anonime derivate se le costanti enum hanno definizioni di metodo (una coppia di ricci dovrebbe fare). Come sempre, le classi derivate avranno nomi come 'Color $ 0 '. –

+0

sì, un paio di parentesi genera il colore $ i –

1

Se siete interessati a come vengono attuate sotto il cofano piuttosto che quello che si può fare con loro, basta dare un'occhiata a their definition.

Modifica 4 anni su: Grr, inaffidabili 4 anni, collegamenti ... non ho trovato un buon collegamento corrente alla fonte, ma si può sempre guardare in su nella vostra propria fonte JDK o semplicemente utilizzare lo wayback machine.

+0

Ancora il mio preferito generico di tutte le volte lì: 'Enum >' - my goodness: x – Voo

+0

Questo link dà un 404. – bfontaine

+0

@bfontaine: true .. vedi la modifica –

0

Le enumerazioni vengono create staticamente quando la classe enum viene caricata per la prima volta e non è modificabile.

È necessario disporre di un costruttore nella classe enum se si desidera assegnare valori diversi all'enumerazione. Dopo che il costruttore è stato completato non è possibile modificare il valore enum (immutabile come detto).

Non è necessario utilizzare il metodo equals() sull'enumerazione: l'operatore == funzionerà correttamente.

Ho scritto un tutorial nel mio blog che mostra alcuni buoni usi della classe enum, che non sono banali dalla semplice lettura del riferimento enum.

se sei interessato, ecco il link. Blog

+0

Il metodo 'public static weekDays fromInt (int value)' nel tuo blog dovrebbe essere sostituito da un 'EnumMap'. Ci sono anche numerosi errori di ortografia, perché c'erano qui prima che li sistemassi per te. – EJP

+0

Non lo farò, ma per rispetto è necessario un processo di revisione migliore * prima * di pubblicare il tuo blog in quel caso. Ad esempio, hai errori elementari come "appaltatore" per "costruttore". – EJP

Problemi correlati