2010-09-22 7 views
15

Estoy buscando una sintaxis compacta para crear instancias de una colección y agregarle algunos elementos. Actualmente uso de esta sintaxis:Sintaxis compacta para crear instancias de una colección de inicialización

Collection<String> collection = 
    new ArrayList<String>(Arrays.asList(new String[] { "1", "2", "3" })); 

Me parece recordar que hay una forma más compacta de hacer esto que utiliza una subclase anónima de ArrayList, a continuación, añade los artículos en el constructor de la subclase. Sin embargo, parece que no puedo recordar la sintaxis exacta.

Respuesta

2

Tal vez era

Collection<String> collection = new ArrayList<String>() {{ 
    add("foo"); 
    add("bar"); 
}}; 

También conocida como la inicialización de doble soporte.

8

Creo que se está pensando en

collection = new ArrayList<String>() { // anonymous subclass 
    { // anonymous initializer 
     add("1"); 
     add("2"); 
     add("3"); 
    } 
} 

cuales, uno comapcted, da

collection = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }} 

FUGLY, por decir lo menos. Sin embargo, hay una variante del método Arrays.asList: Arrays.asList(T...a) que proporciona compatibilidad y legibilidad. A modo de ejemplo, se da la siguiente línea de código:

collection = new ArrayList<String>(Arrays.asList("1", "2", "3")); // yep, this one is the shorter 

Y note que no se crea una subclase anónima de ArrayList de dudosa utilidad.

0

Tal vez sea sólo yo, pero no veo el punto de complicar las cosas, únicamente en la búsqueda de la escritura de código más corto/más rápido. Dada la opción de escribir marginalmente menos líneas de código y una depuración/revisión mucho más fácil, estoy bastante seguro de que elegiría la segunda opción.

Así que a menos que haya una razón particular para presionar por mantener esto corto, yo diría que se adhieren a la navaja de afeitar de Ockham, y dadas una serie de soluciones a un problema, vaya con la más simple. De esta forma, cuando algo sale mal (lo que la ley de Murphy claramente dicta que sucederá), será mucho más fácil rastrearlo. :)

1

puede crear una función de utilidad:

@SafeVarargs 
public static <T> List<T> listOf(T ... values) { 
    return new ArrayList<T>(Arrays.asList(values)); 
} 

Así se podría llamar como:

collection = MyUtils.listOf("1", "2", "3"); 

esta manera, se puede rellenar una lista muy fácilmente, y todavía mantenerlo mutable .

Cuestiones relacionadas