2009-07-01 10 views

Respuesta

252

Las enumeraciones Java no son como enums C o C++, que en realidad son solo etiquetas para enteros.

Las enumeraciones Java se implementan más como clases, e incluso pueden tener múltiples atributos.

public enum Ids { 
    OPEN(100), CLOSE(200); 

    private final int id; 
    Ids(int id) { this.id = id; } 
    public int getValue() { return id; } 
} 

La gran diferencia es que son de tipo seguro lo que significa que no tiene que preocuparse por la asignación de una enumeración de color a una variable de tamaño.

Ver http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html para más.

+0

Según su afirmación, sería la mejor práctica usar java para crear una enumeración de enteros secuenciales (similar a una enum de C++), para un índice en una matriz o algo así, escriba: enum Id. { NOMBRE (0), EDAD (1), ALTURA (2), PESO (3); } Gracias, -bn –

+0

Posiblemente, y especialmente si alguna vez serializas los valores integrales en alguna parte. – lavinio

+1

¿puede decirnos cómo usar esta enumeración en una función? –

73

Sí. Puede pasar los valores numéricos para el constructor de la enumeración, así:

enum Ids { 
    OPEN(100), 
    CLOSE(200); 

    private int value;  

    private Ids(int value) { 
    this.value = value; 
    } 

    public int getValue() { 
    return value; 
    } 
} 

Véase el Sun Java Language Guide para más información.

+0

fresca. ¿Es posible mezclar? Es decir. solo asigne números a los valores Enum elegidos. –

+0

modificador privado es redundante para constructores enum –

10

Si usa tipos de enumeración muy grandes, el siguiente puede ser útil;

10

cuál es sobre el uso de esta forma:

public enum HL_COLORS{ 
      YELLOW, 
      ORANGE; 

      public int getColorValue() { 
       switch (this) { 
      case YELLOW: 
       return 0xffffff00; 
      case ORANGE: 
       return 0xffffa500;  
      default://YELLOW 
       return 0xffffff00; 
      } 
      } 
} 

sólo hay un método ..

puede utilizar el método estático y pasar el Enum como parámetro como:

public enum HL_COLORS{ 
      YELLOW, 
      ORANGE; 

      public static int getColorValue(HL_COLORS hl) { 
       switch (hl) { 
      case YELLOW: 
       return 0xffffff00; 
      case ORANGE: 
       return 0xffffa500;  
      default://YELLOW 
       return 0xffffff00; 
      } 
      } 

Tenga en cuenta que estas dos formas utilizan menos memoria y más unidades de proceso. No lo hago Digo que esta es la mejor manera, pero es solo otro enfoque.

+1

¿Por qué 'getColorValue()' está sincronizado en el segundo ejemplo? – josaphatv

+0

No tiene sentido ... Lo eliminé del código ... gracias –

2

Si desea emular enumeración de C/C++ (num base y nextS incrementales):

enum ids { 
    OPEN, CLOSE; 
    // 
    private static final int BASE_ORDINAL = 100; 
    public int getCode() { 
     return ordinal() + BASE_ORDINAL; 
    } 
}; 

public class TestEnum { 
    public static void main (String... args){ 
     for (ids i : new ids[] { ids.OPEN, ids.CLOSE }) { 
      System.out.println(i.toString() + " " + 
       i.ordinal() + " " + 
       i.getCode()); 
     } 
    } 
} 
OPEN 0 100 
CLOSE 1 101 
Cuestiones relacionadas