web-dev-qa-db-fra.com

Création d'un ensemble pré-rempli dans Java

En Java, comment créer un ensemble final rempli lors de la construction? Je veux faire quelque chose comme ceci:

static final Set<Integer> NECESSARY_PERMISSIONS 
    = new HashSet<Integer>([1,2,3,6]);

mais je ne connais pas la syntaxe appropriée en Java.

18
Sal

Essayez cet idiome:

import Java.util.Arrays;

new HashSet<Integer>(Arrays.asList(1, 2, 3, 6))
57
Tomasz Nurkiewicz

Vous pourriez envisager d'utiliser la goyave ImmutableSet :

static final Set<Integer> NECESSARY_PERMISSIONS = ImmutableSet.<Integer>builder()
        .add(1)
        .add(2)
        .add(3)
        .add(6)
        .build();
static final Set<String> FOO = ImmutableSet.of("foo", "bar", "baz");

Entre autres choses, c'est beaucoup plus rapide (et ~ 3 fois plus efficace en termes d'espace) que HashSet.

19
Paul Bellora

Le moyen le plus simple, en utilisant les classes Java classes, est

static final Set<Integer> NECESSARY_PERMISSIONS = 
    Collections.unmodifiableSet(new HashSet<Integer>(Arrays.asList(1, 2, 3, 6)));

Mais vous pouvez également utiliser un initialiseur statique ou déléguer à une méthode statique privée:

static final Set<Integer> NECESSARY_PERMISSIONS = createNecessaryPermissions();

Notez le wrapper unmodifiableSet, qui garantit que votre ensemble constant est en effet constant.

8
JB Nizet

En utilisant la bibliothèque Google Guava , vous pouvez utiliser ImmutableSet , qui est conçue exactement dans ce cas (valeurs constantes):

static final ImmutableSet<Integer> NECESSARY_PERMISSIONS =
        ImmutableSet.of(1,2,3,6);

Façon old-school (sans bibliothèque):

static final Set<Integer> NECESSARY_PERMISSIONS =
        new HashSet<Integer>(Arrays.asList(1,2,3,6));

MODIFIER:

Dans Java 9 + , vous pouvez utiliser Immutable Set Static Factory Methods :

static final Set<Integer> NECESSARY_PERMISSIONS =
        Set.of(1,2,3,6);
7
Xaerxess

Vous pouvez le faire de la manière suivante, l'OMI étant bien meilleure et plus concise que les autres exemples de cette rubrique:

public static <T> Set<T> set(T... ts) {
    return new HashSet<>(Arrays.asList(ts));
}

après l'import statique, vous pouvez écrire quelque chose comme ceci:

public static final Set<Integer> INTS = set(1, 2, 3);
6
Konstantin Solomatov
Set<String> s = new HashSet<String>() {{  
  add("1"); add("2"); add("5");  
}};
2
Andrew Logvinov