2012-02-27 8 views
14

En Java, ¿cómo creo un conjunto final que se rellena en la construcción? Quiero hacer algo como lo siguiente:Creación de un conjunto prepoblado en Java

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

pero no conozco la sintaxis adecuada en Java.

+2

designo a este para volver a abrir porque no es la sutil diferencia: esta última pide específicamente mientras que el otro para el paradigma general. Por ejemplo, una respuesta que incluye 'Collections.unmodifiableSet()' sería adecuada para esto pero no para la otra. – demongolem

Respuesta

48

Pruebe este idioma:

import java.util.Arrays; 

new HashSet<Integer>(Arrays.asList(1, 2, 3, 6)) 
2
Set<String> s = new HashSet<String>() {{ 
    add("1"); add("2"); add("5"); 
}}; 
+4

Tenga en cuenta [inconvenientes de inicialización de llaves dobles] (http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization). – Xaerxess

+0

@Xaerxess Gracias, lo comprobaré. –

7

La forma más sencilla, utilizando las clases estándar de Java, es

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

Pero también se puede utilizar un inicializador estático, o delegar a una estructura estática privada método:

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

Tenga en cuenta la unmodifiableSet envoltura, lo que garantiza que su conjunto constante es de hecho constante.

17

Se podría considerar el uso de guayaba 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 otras cosas, esto es mucho más rápido (y ~ 3 veces más eficiente con el espacio) que HashSet.

+0

@Louis - Gracias, me olvidé de esa sintaxis simplificada. –

5

Usando Google Guava biblioteca puede utilizar ImmutableSet, que está diseñado exactamente para este caso (valores constantes):

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

manera-Retro (sin ningún tipo de biblioteca):

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

Usted puede Haga esto de la siguiente manera que IMO es mucho mejor y más conciso que otros ejemplos en este tema:

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

después de importarlo estáticamente se puede escribir algo como esto:

public static final Set<Integer> INTS = set(1, 2, 3); 
Cuestiones relacionadas