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
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
}
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.
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
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
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
- 1. Come vengono implementate le applicazioni Java nel "mondo reale"?
- 2. Come vengono implementate le funzioni iomanip?
- 3. Come vengono implementate le espressioni regolari in .NET?
- 4. In che modo vengono implementate le variabili dell'interfaccia in Go?
- 5. Come vengono implementate le variabili pigri locali di Scala?
- 6. Aiuto con le enumerazioni in Java
- 7. Come memorizzare le enumerazioni in Realm?
- 8. Java: perché TimeUnit ha perso le enumerazioni?
- 9. Differenze tra le enumerazioni scala e java
- 10. In che modo le connessioni di database sicure vengono solitamente implementate nei file JAR?
- 11. Cosa sono le raccolte implementate come in VB6?
- 12. toString Uitvoeringsbesluit enumerazioni Java
- 13. Lavorare con le enumerazioni in Scala
- 14. non può compilare le enumerazioni in Eclipse
- 15. Come sono implementate le strutture di mutex e lock?
- 16. Perché Java enumerazioni non clonabile?
- 17. PetaPoco gestisce le enumerazioni?
- 18. Come sono implementate le costanti __LINE__ e __FILE__ in Ruby?
- 19. Conservare un ordinamento di enumerazioni in Java
- 20. Come accedere alle enumerazioni Java da Scala?
- 21. Dove definire le enumerazioni
- 22. Java: il casting di tipo dinamico utilizzando le enumerazioni
- 23. come condividere costanti (enumerazioni) tra le classi?
- 24. Come avere nomi userfriendly per le enumerazioni?
- 25. Le enumerazioni Java sono considerate tipi primitivi o di riferimento?
- 26. Decompilatore Java che funziona con Java 5 (gestisce le enumerazioni tra le altre cose nuove)
- 27. Memorizza le enumerazioni in un NSArray?
- 28. È possibile utilizzare le enumerazioni in RealmSwift?
- 29. Come implementate l'evidenziazione della sintassi?
- 30. Proprietà implementate automaticamente in C#
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 '. –
sì, un paio di parentesi genera il colore $ i –