Uso de Collections.singletonList () de Java?

164

¿Para qué sirve Collections.singletonList()Java? Entiendo que devuelve una lista con un elemento. ¿Por qué querría tener un método separado para hacer eso? ¿Cómo juega aquí la inmutabilidad?

¿Hay algún caso de uso útil especial para este método en lugar de ser simplemente un método conveniente?

Martillo de peste
fuente
66
Aquí hay un ejemplo de cómo puede ser útil: stackoverflow.com/a/1239631/360811
shabunc
1
posible duplicado de Arrays.asList () vs Collections.singletonList ()
sschuberth
1
@sschuberth, compare las fechas de las preguntas. OP no sabía que él / ella podría estar duplicando una pregunta futura
KumarAnkit
Es cierto, @KumarAnkit, pero los enlaces a duplicados siguen siendo útiles para las personas que buscan respuestas alternativas / potencialmente mejores. De hecho, creo que la vinculación como duplicado debe considerarse como una cosa bidireccional, y las mejores preguntas / respuestas deben mantenerse, sin importar si son las más antiguas o las más nuevas.
sschuberth
@sschuberth, buen punto, pero debería clasificarse como similar, como esta pregunta aquí.
KumarAnkit

Respuestas:

159

El javadoc dice esto:

"Devuelve una lista inmutable que contiene solo el objeto especificado. La lista devuelta es serializable".

Usted pregunta:

¿Por qué querría tener un método separado para hacer eso?

Principalmente como una conveniencia ... para ahorrarle tener que escribir una secuencia de declaraciones para:

  • crear un objeto de lista vacío
  • agregarle un elemento y
  • envuélvelo con una envoltura inmutable.

También puede ser un poco más rápido y / o ahorrar un poco de memoria, pero es poco probable que estos pequeños ahorros sean significativos. (Una aplicación que crea grandes cantidades de listas singleton es inusual por decir lo menos).

¿Cómo juega aquí la inmutabilidad?

Es parte de la especificación del método; véase más arriba.

¿Existen casos de uso útiles especiales para este método, en lugar de ser simplemente un método de conveniencia?

Claramente, hay casos de uso en los que es conveniente usar el singletonListmétodo. Pero no sé cómo distinguirías (objetivamente) entre un caso de uso ordinario y uno "especialmente útil" ...

Stephen C
fuente
26

Aquí hay una vista sobre los métodos singleton:

He encontrado que estos diversos métodos "singleton" son útiles para pasar un valor único a una API que requiere una colección de ese valor. Por supuesto, esto funciona mejor cuando el código que procesa el valor pasado no necesita agregarse a la colección.

Jim Ferrans
fuente
¿Me pueden ayudar a entender esta parte del comentario anterior? "Por supuesto, esto funciona mejor cuando el código que procesa el valor pasado no necesita agregarse a la colección". No lo entendí.
Bilbo Baggins
2
Creo que se refiere a no poder modificar la lista aprobada, ya que es inmutable.
Daniel Higueras
2
@BilboBaggins: esa declaración fue irónica. :-) La frase "esto funciona mejor cuando ..." se escribe con mayor precisión "esto solo funciona si ...".
Stephen C
18

Del javadoc

@param  the sole object to be stored in the returned list.
@return an immutable list containing only the specified object.

ejemplo

import java.util.*;

public class HelloWorld {
    public static void main(String args[]) {
        // create an array of string objs
        String initList[] = { "One", "Two", "Four", "One",};

        // create one list
        List list = new ArrayList(Arrays.asList(initList));

        System.out.println("List value before: "+list);

        // create singleton list
        list = Collections.singletonList("OnlyOneElement");
        list.add("five"); //throws UnsupportedOperationException
        System.out.println("List value after: "+list);
    }
}

Úselo cuando el código espera una lista de solo lectura, pero solo desea pasar un elemento en ella. singletonListes (thread-) seguro y rápido.

salsinga
fuente
Gracias, esta es la mejor respuesta. Incluso da un ejemplo en lugar de simplemente decir "Claramente hay casos de uso, pero no sé sobre ellos".
theprogrammer
3

Para responder a su pregunta inmutable:

Collections.singletonListcreará una lista inmutable. Una Lista inmutable (también conocida como Lista no modificable) no puede cambiar su contenido. Los métodos para agregar o eliminar elementos generarán excepciones si intenta alterar el contenido.

Una lista singleton contiene solo ese elemento y no puede modificarse.

ajain
fuente
2

Si una colección Immutable / Singleton se refiere a la que tiene un solo objeto y que no se modifica más, entonces se puede lograr la misma funcionalidad haciendo una colección "UnmodifiableCollection" que tenga un solo objeto. Dado que la Colección Unmodifiable puede lograr la misma funcionalidad con un objeto, ¿para qué propósito especial sirve la Colección Singleton?

Anónimo
fuente
Cree una colección no modificable con un objeto de la forma "normal" y utilizando el método singleton. Entonces ves inmediatamente por qué.
kap
1

singletonList puede contener instancias de cualquier objeto. El estado del objeto puede ser modificado.

List<Character> list = new ArrayList<Character>();
list.add('X');
list.add('Y');
System.out.println("Initial list: "+ list);
List<List<Character>> list2 = Collections.singletonList(list);
list.add('Z');
System.out.println(list);
System.out.println(list2);

No podemos definir una Lista no modificable como la anterior.

Sarang
fuente