studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java enums java-8 enumeration

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;