2010-07-12 2 views
45

Si j'ai un objet enum, est-ce considéré comme une primitive ou une référence?Les énumérations Java sont-elles considérées comme des types primitifs ou de référence?

+0

énumérations sont des classes tout à fait normal w/certaines optimisations (pour la sérialisation) + contrôle c-tor pour le niveau d'héritage + tableau partagé supplémentaire (non clonées()) des énumérations déclarées. La méthode publique values ​​() renvoie toujours une nouvelle copie. Ils peuvent implémenter des interfaces et ce n'est pas le cas :) – bestsss

Répondre

50

C'est un type de référence.

Contrairement à de nombreux langages dans lesquels un enum est un ensemble de constantes intégrales, les énumérations Java sont des instances d'objet immuables. Vous pouvez obtenir la valeur numérique d'une instance enum en appelant ordinal().

Vous pouvez même ajouter vos propres membres à la classe ENUM, comme ceci:

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 Je n'étais absolument pas au courant de cette fonctionnalité. Pourriez-vous donner un exemple de la façon d'utiliser cette opération en action? – corsiKa

+10

Les instances 'enum' ne doivent pas nécessairement être immuables. Une énumération peut avoir des variables mutables. – sepp2k

+0

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

0

This article vous montre essentiellement la façon dont les énumérations sont mises en œuvre, et comme le dit SLaks, ils sont des références.

10

La façon dont énumérations travail est en fait pas trop différent de la façon dont ils ont été utilisés avant leur introduction avec 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 
}} 

En instancier les différentes combinaisons sur le chargement des classes, il est assuré que ceux-ci seront mutuellement exclusifs et le constructeur privé s'assure qu'aucune autre instance ne sera créée.

Ceux-ci seraient comparables soit par = = soit égal à.

ENUM Java 5 fonctionne à peu près de la même façon, mais avec quelques fonctionnalités nécessaires pour soutenir sérialisation etc.

J'espère que ce fond jette un peu plus de lumière.

Questions connexes