java - para - manual de programacion android pdf
En java, ¿a qué compila tal tipo de enumeración? (3)
A continuación se muestra el código que define el tipo de enumeración.
enum Company{
EBAY(30), PAYPAL(10), GOOGLE(15), YAHOO(20), ATT(25);
private int value;
private Company(int value){
super(this.name());
this.value = value;
}
public int getValue(){
return value;
}
}
que se compila internamente,
final class Company extends Enum<Company>{
public final static Company EBAY = new Company(30);
public final static Company PAYPAL = new Company(10);
public final static Company GOOGLE = new Company(15);
public final static Company YAHOO = new Company(20);
public final static Company ATT = new Company(25);
private int value;
private Company(int value){
super(this.name(),Enum.valueOf(Company.class, this.name()));
this.value = value;
}
public int getValue(){
return value;
}
}
Es mi entendimiento correcto?
Casi, su segundo fragmento representa bien lo generado internamente por el compilador (bytecode), sin embargo, no es exactamente lo mismo.
Una enumeración compilada contendrá el indicador ACC_ENUM
que indica que esta clase o su superclase está declarada como un tipo enumerado y será tratada como tal por la JVM.
Su segundo fragmento no (suponiendo que compilara) incluiría esta bandera en el bytecode:
ENUM
final class Company extends java.lang.Enum<Company>
minor version: 0
major version: 52
flags: ACC_FINAL, ACC_SUPER, ACC_ENUM
CLASE
final class Company
minor version: 0
major version: 52
flags: ACC_FINAL, ACC_SUPER
En cuanto al resto de su lógica (aún suponiendo que se compilaría), es correcta. Internamente, una enumeración se representará como una clase final
que amplía java.lang.Enum
. Sin embargo, tenga en cuenta que no puede extender directamente java.lang.Enum
ya que el compilador realiza estas cosas al crear una enumeración y podría generar un error de compilación si intenta hacerlo usted mismo.
Funcionalmente, sí. Literalmente no (no se puede subclasificar explícitamente a Enum
por una cosa). enum(s)
tienen un toString
. Y su enum
no es un código válido (no puede llamar a super()
) y getValue
necesita un tipo de devolución.
enum Company{
EBAY(30), PAYPAL(10), GOOGLE(15), YAHOO(20), ATT(25);
private int value;
private Company(int value){
this.value = value;
}
public int getValue(){
return value;
}
}
Si elimina la llamada a super
que es ilegal y this.name
como parámetro para super también es ilegal, this.name
y this.name
javap en la clase, esto es resultado:
$ /usr/lib/jvm/java-7-oracle/bin/javap -p Company.class
Compiled from "Company.java"
final class Company extends java.lang.Enum<Company> {
public static final Company EBAY;
public static final Company PAYPAL;
public static final Company GOOGLE;
public static final Company YAHOO;
public static final Company ATT;
private int value;
private static final Company[] $VALUES;
public static Company[] values();
public static Company valueOf(java.lang.String);
private Company(int);
public int getValue();
static {};
}
Aquí está el bytecode para static, parte de él
static {};
flags: ACC_STATIC
LineNumberTable:
line 2: 0
line 1: 75
Code:
stack=5, locals=0, args_size=0
0: new #4 // class Company
3: dup
4: ldc #8 // String EBAY
6: iconst_0
7: bipush 30
9: invokespecial #9 // Method "<init>":(Ljava/lang/String;II)V
12: putstatic #10 // Field EBAY:LCompany;