En Java, vous pouvez » t spécifiez explicitement les valeurs ordinales . Ils s'autoincrément toujours, à partir de 0, sans aucun contrôle sur elle.
Si vous voulez d'autres valeurs personnalisées, vous devez les placer dans des appels de constructeur et les stocker vous-même. Vous pouvez obtenir autoincrement, mais il est dégueu que diable:
import java.util.EnumSet;
// Please don't ever use this code. It's here so you can point and laugh.
enum Foo
{
A(10), B, C, D(5000), E, Fish;
private static int nextValue;
private int value;
private Foo()
{
this(Counter.nextValue);
}
private Foo(int value)
{
this.value = value;
Counter.nextValue = value + 1;
}
public int getValue()
{
return value;
}
private static class Counter
{
private static int nextValue = 0;
}
}
public class Test
{
public static void main(String[] args)
{
for (Foo foo : EnumSet.allOf(Foo.class))
{
System.out.println(foo.name() + " " +
foo.ordinal() + " " +
foo.getValue());
}
}
}
Notez la nécessité pour la classe imbriquée, parce que vous ne pouvez pas accéder aux champs statiques dans un constructeur ENUM. Ick, ick, ick. S'il vous plaît ne faites pas ça.
'Il est ici, donc vous pouvez pointer et laugh.' Haha. Un bon! –
le constructeur par défaut doit mettre à jour Counter.nextValue, et vous pouvez probablement supprimer nextValue directement dans Foo. – Yuliy
@Yuliy: Le constructeur sans paramètre appelle celui paramétré, ce qui met à jour Counter.nextValue. Mettre nextValue directement dans Foo * ne fonctionne pas - du moins pas avec la version de javac que j'utilise. Cela vous empêche d'accéder aux champs statiques dans le constructeur. –