2009-11-16 6 views
50

J'ai énumération comme ceci:valeurs Enum() Longueur vs domaine privé

public enum Configuration { 
    XML(1), 
    XSLT(10), 
    TXT(100), 
    HTML(2), 
    DB(20); 

    private final int id; 
    private Configuration(int id) { 
     this.id = id; 
    } 
    public int getId() { return id; } 
} 

Parfois, je besoin de vérifier combien de champs je dans l'énumération. Quelle est la meilleure solution? Devrais-je utiliser une méthode "values ​​(). Length"? Ou peut-être, je dois créer champ constant dans l'énumération comme ceci:

public enum Configuration { 
    XML(1), 
    XSLT(10), 
    TXT(100), 
    HTML(2), 
    DB(20); 

    private final int id; 
    private Configuration(int id) { 
     this.id = id; 
    } 
    public int getId() { return id; } 

    public static final int Size = 5; 
} 

Quelle est la solution la plus rapide et plus élégante?

Répondre

87

Je crée parfois mon propre List (ou définir, ou mapper, ce dont j'ai besoin) pour éviter cette copie inutile. Je ne dur code il si ... si vous avez besoin de la taille, je venais d'utiliser:

private static final int size = Configuration.values().length; 

à la fin. Au moment de l'évaluation, toutes les valeurs auront été initialisées. Cela évite les problèmes DRY et d'incohérence soulevés dans d'autres réponses.

Bien sûr, c'est un peu une micro-optimisation en soi ... mais qui finit avec plus simple code à la fin, IMO. Appeler values().length d'ailleurs n'exprime pas ce qui vous intéresse, qui est juste la taille de l'enum - le fait que vous obtenez à travers un tableau de valeurs est accessoire et distrayant, IMO. Une alternative à l'utilisation values() est d'utiliser EnumSet.allOf().size() qui, pour les petites enums sera très bon marché - mais encore une fois, ce n'est pas aussi lisible qu'un simple champ size.

+1

Si vous voulez respecter les conventions de nommage Java, ne devriez-vous pas nommer cette constante 'SIZE' plutôt que' size'? – Jubobs

+0

@Jubobs: Je le ferais certainement pour une constante publique, mais pour une personne privée, cela ne me dérange pas beaucoup de toute façon. Notez que ce n'est pas une constante * compile-time *. –

+0

Merci d'avoir expliqué votre raison d'être. – Jubobs

9

Je recommanderais d'utiliser values().length. C'est beaucoup plus élégant et les frais généraux de performance par rapport à l'utilisation d'une constante seront négligeables. En outre, vous éliminez le risque que la constante ne devienne jamais en décalage avec la longueur réelle de l'énumération.

7

En stockant le nombre que vous violez le DRY principle, donc à moins que vous n'ayez une très bonne raison, vous ne devriez pas. L'utilisation de values().length créera une nouvelle copie de la matrice chaque fois que vous l'appelez.

+0

Aaarrgghh - Je cherchais désespérément Google pour cela mais j'ai oublié comment il s'appelait! – Adamski

3

Une autre approche consiste à utiliser une constante initialisée au-dessus de la méthode values ​​(). De cette façon, vous avez une constante mise à jour automatiquement et vous évitez toujours le surcoût "values ​​()".

Questions connexes