Est-il possible de créer ArrayList de valeurs enum (et de le manipuler)? Par exemple:
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
Oui c'est certainement possible, mais vous devrez le faire
List<MyEnum> al = new ArrayList<MyEnum>();
Vous pouvez ensuite ajouter des éléments à al
: al.add(ONE)
ou al.add(TWO)
.
Vous pouvez simplement écrire
new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));
La réponse (EnumSet
) de Amit Deshpande et la réponse (.values
) De Marko Topolnik sont corrects. Voici un peu plus d'informations.
Enum.values
La méthode .values()
est une méthode déclarée implicitement sur Enum
, ajoutée par le compilateur. Il produit un tableau brut plutôt qu'un Collection
. Certainement utilisable.
Note spéciale sur la documentation: étant inhabituelle en tant que méthode déclarée implicitement , la méthode .values()
est non répertorié parmi les méthodes de la classe Enum
. La méthode est définie dans la spécification du langage Java , et est mentionnée dans le document relatif à Enum.valueOf
.
EnumSet
- Rapide & PetitLes avantages de EnumSet
incluent:
Pour citer le document de classe:
Les ensembles d'énumération sont représentés de manière interne en tant que vecteurs de bits. Cette représentation est extrêmement compacte et efficace. Les performances spatio-temporelles de cette classe doivent être suffisantes pour permettre son utilisation en tant qu’alternative de type haute qualité et de haute qualité aux "indicateurs de bits" classiques basés sur int. Même les opérations en bloc (telles que containsAll et rétentionAll) devraient s'exécuter très rapidement si leur argument est également un ensemble énuméré.
Étant donné cet enum:
enum Animal
{
DOG , CAT , BIRD , BAT ;
}
Faites un EnumSet
en une ligne.
EnumSet<Animal> allAnimals = EnumSet.allOf( Animal.class );
Dump à la console.
System.out.println( "allAnimals : " + allAnimals );
tous les animaux: [CHIEN, CHAT, OISEAU, BAT]
Créez un ensemble à partir d'un sous-ensemble des objets enum.
EnumSet<Animal> flyingAnimals = EnumSet.of( BIRD , BAT );
Regardez le document de classe pour voir de nombreuses façons de manipuler la collection, notamment en ajoutant ou en supprimant des éléments.
EnumSet<Animal> featheredFlyingAnimals =
EnumSet.copyOf( flyingAnimals ).remove( BAT );
La doc promet que l'itérateur pour EnumSet est dans l'ordre naturel, l'ordre dans lequel les valeurs de l'énum ont été déclarées à l'origine.
Pour citer le document de classe:
L'itérateur renvoyé par la méthode iterator parcourt les éléments dans leur ordre naturel (l'ordre dans lequel les constantes enum sont déclarées).
Franchement, étant donné cette promesse, je ne comprends pas pourquoi ce n’est pas un SortedSet
. Mais bon, ça va. Nous pouvons créer un List
à partir de Set
si vous le souhaitez. Passez n'importe quel Collection
au constructeur de ArrayList
et la collection Iterator
de cette collection est automatiquement appelée en votre nom.
List<Animal> list = new ArrayList<>( allAnimals );
Dump à la console.
System.out.println("list : " + list );
Quand couru.
list : [DOG, CAT, BIRD, BAT]
Dans Java 10 et versions ultérieures, vous pouvez facilement créer un List
non modifiable en passant le EnumSet
.
List< Animal > nonModList = List.copyOf( allAnimals ) ; // Or pass Animals.values()
C'est possible mais vous devriez utiliser EnumSet
enum MyEnum {
ONE, TWO;
public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO);
}
C'est une solution plus générique, qui peut être utilisée pour tout objet Enum, alors soyez libre de tout utilisé.
static public List<Object> constFromEnumToList(Class enumType) {
List<Object> nueva = new ArrayList<Object>();
if (enumType.isEnum()) {
try {
Class<?> cls = Class.forName(enumType.getCanonicalName());
Object[] consts = cls.getEnumConstants();
nueva.addAll(Arrays.asList(consts));
} catch (ClassNotFoundException e) {
System.out.println("No se localizo la clase");
}
}
return nueva;
}
Maintenant, vous devez appeler de cette façon:
constFromEnumToList(MiEnum.class);
Une énumération est juste une autre classe en Java, cela devrait être possible.
Plus précisément, une énumération est une instance de Object: http://docs.Oracle.com/javase/6/docs/api/Java/lang/Enum.html
Alors oui, ça devrait marcher.