2010-07-12 18 views
45

Si tengo un objeto enum, ¿se lo considera una primitiva o una referencia?¿Las enumeraciones de Java se consideran primitivas o de referencia?

+0

enumeraciones son clases absolutamente normales w/algunas optimizaciones (por serialización) + cheque c-tor para el nivel de la herencia + matriz extra compartido (no clonados()) de enums declarados. Los valores de método público() siempre devuelven una nueva copia. Pueden implementar interfaces y lo que no :) – bestsss

Respuesta

50

Es un tipo de referencia.

A diferencia de muchos idiomas, en los que enum es un conjunto de constantes integrales, las enumeraciones de Java son instancias de objetos inmutables. Puede obtener el valor numérico de una instancia enum llamando al ordinal().

Usted puede incluso añadir sus propios miembros de la clase de enumeración, así:

public enum Operation { 
    PLUS { double eval(double x, double y) { return x + y; } }, 
    MINUS { double eval(double x, double y) { return x - y; } }, 
    TIMES { double eval(double x, double y) { return x * y; } }, 
    DIVIDE { double eval(double x, double y) { return x/y; } }; 

    // Do arithmetic op represented by this constant 
    abstract double eval(double x, double y); 
} 
//Elsewhere: 
Operation op = Operation.PLUS; 
double two = op.eval(1, 1); 
+0

+1 No tenía conocimiento de esta funcionalidad. ¿Podría darnos un ejemplo de cómo usar esa operación en acción? – corsiKa

+10

instancias 'enum' no tienen que ser inmutables en realidad. Una enumeración puede tener variables mutables. – sepp2k

+0

@glowcoder: 'Operation.PLUS.eval (1, 1)' – SLaks

0

This article que muestra esencialmente cómo se implementan las enumeraciones, y como dice SLaks, que son referencias.

10

La forma de trabajar de las enumeraciones en realidad no es muy diferente de la forma en que se utilizaron antes de su introducción con Java 5:

public final class Suit { 

public static final Suit CLUBS = new Suit(); 
public static final Suit DIAMONDS = new Suit(); 
public static final Suit HEARTS = new Suit(); 
public static final Suit SPADES = new Suit(); 

/** 
* Prevent external instantiation. 
*/ 
private Suit() { 
    // No implementation 
}} 

creando instancias de los diferentes palos en la carga de clases, se asegura que estos serán mutuamente excluyentes y el constructor privado garantiza que no se crearán más instancias.

Estos serían comparables a través de == o iguales.

La enumeración de Java 5 funciona más o menos la misma manera, pero con algunas características necesarias para apoyar la serialización etc.

espero que este fondo arroja algo más de luz.

Cuestiones relacionadas