2011-01-26 25 views
96

¿Cuál es el uso de Collections.singletonList() en Java? Entiendo que devuelve una lista con un elemento. ¿Por qué querría tener un método separado para hacer eso? ¿Cómo juega la inmutabilidad un papel aquí?Uso de Collections.singletonList() de Java?

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

+3

Aquí hay un ejemplo de cómo puede ser útil: http://stackoverflow.com/a/1239631/360811 – shabunc

+0

posible duplicación de [Arrays.asList() vs Collections.singletonList()] (http://stackoverflow.com/questions/26027396/arrays-aslist-vs-collections-singletonlist) – sschuberth

Respuesta

106

El javadoc dice esto:

"Devuelve una lista inmutable que contiene sólo el objeto especificado La lista devuelta es serializable.".

le preguntas:

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

Por comodidad ... para ahorrar el tener que escribir una secuencia de instrucciones a:

  • crear una lista de objetos vacío
  • añadir un elemento a la misma, y ​​
  • envolverla con una envoltura inmutable.

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

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

+0

¿Es equivalente a 'Collections.unmodifiableSet (new Set(). Add())'? –

+4

En términos generales, sí. (Hay dos errores en ese fragmento.) –

+0

Algunos enlaces fuente jdk9-b51 para curiosos: http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/a0dad230aeb3/src/java.base/share /classes/java/util/Collections.java#l1117, http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/a0dad230aeb3/src/java.base/share/classes/java/util/Collections .java # l4788 –

16

Aquí hay uno view sobre los métodos singleton:

he encontrado estos diversos métodos "simples" para ser útil para el paso de un único valor a una API que requiere una colección de ese valor. Por supuesto, esto funciona mejor cuando el código que procesa el valor transferido no necesita agregarse a la colección.

+0

¿Puede ayudarme a entender esta parte del comentario anterior?"Por supuesto, esto funciona mejor cuando el código que procesa el valor transferido no necesita agregarse a la colección". No lo entendí –

+2

Creo que se refiere a que no se puede modificar la lista de usuarios pasados, ya que es inmutable. –

2

Si una colección Inmutable/Singleton se refiere a la que tiene solo un objeto y cuál ya no se modifica, entonces se puede lograr la misma funcionalidad haciendo que una colección "Colección no modificable" tenga solo un objeto. Dado que la misma funcionalidad puede lograrse mediante Unmodifiable Collection con un solo objeto, ¿para qué propósito especial sirve la colección Singleton?

+0

Crea una colección no modificable con un objeto de la manera "normal" y usando el método singleton. Entonces ves de inmediato por qué. – kap

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

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 espere una lista de solo lectura, pero solo quiere pasar un elemento en él. singletonList es (hilo) seguro y rápido.