Uso de Collections.singletonList () do Java?

164

Para que serve o Collections.singletonList()Java? Eu entendo que ele retorna uma lista com um elemento. Por que eu gostaria de ter um método separado para fazer isso? Como a imutabilidade desempenha um papel aqui?

Existem casos de uso úteis especiais para esse método, em vez de apenas ser um método conveniente?

PlagueHammer
fonte
6
Aqui é exemplo de como ele pode ser útil - stackoverflow.com/a/1239631/360811
shabunc
1
possível duplicado de Arrays.asList () vs Collections.singletonList ()
sschuberth
1
@sschuberth, compare as datas das perguntas. OP não estava ciente de que ele / ela poderia ser duplicar uma pergunta futuro
KumarAnkit
É verdade, @KumarAnkit, mas os links para duplicatas ainda são úteis para pessoas que procuram respostas alternativas / potencialmente melhores. Na verdade, acredito que vincular como duplicado deve ser considerado uma coisa bidirecional, e as melhores perguntas / respostas devem ser mantidas, independentemente de serem as mais antigas ou as mais recentes.
sschuberth
@sschuberth, bom ponto, mas deve ser classificado como similar, como esta pergunta aqui.
precisa saber é o seguinte

Respostas:

159

O javadoc diz o seguinte:

"Retorna uma lista imutável que contém apenas o objeto especificado. A lista retornada é serializável."

Você pergunta:

Por que eu gostaria de ter um método separado para fazer isso?

Principalmente como uma conveniência ... para poupar a necessidade de escrever uma sequência de instruções para:

  • crie um objeto de lista vazio
  • adicione um elemento a ele e
  • envolva-o com um invólucro imutável.

Também pode ser um pouco mais rápido e / ou economizar um pouco de memória, mas é improvável que essas pequenas economias sejam significativas. (Um aplicativo que cria um grande número de listas de singleton é incomum, para dizer o mínimo.)

Como a imutabilidade desempenha um papel aqui?

Faz parte da especificação do método; Veja acima.

Existem casos de uso úteis especiais para esse método, em vez de apenas ser um método de conveniência?

Claramente, existem casos de uso em que é conveniente usar o singletonListmétodo Mas não sei como você distinguiria (objetivamente) entre um caso de uso comum e um "especialmente útil" ...

Stephen C
fonte
26

Aqui está uma visão sobre os métodos singleton:

Eu descobri que esses vários métodos "singleton" são úteis para passar um único valor para uma API que requer uma coleção desse valor. Obviamente, isso funciona melhor quando o código que processa o valor passado não precisa ser adicionado à coleção.

Jim Ferrans
fonte
Você pode me ajudar a entender essa parte do comentário acima? "Obviamente, isso funciona melhor quando o código que processa o valor passado não precisa ser adicionado à coleção". Eu não entendi.
Bilbo Baggins
2
Eu acho que ele se refere a não poder modificar a lista passada, pois é imutável.
Daniel Higueras
2
@BilboBaggins - Essa afirmação foi irônica. :-) A frase "isso funciona melhor quando ..." é escrita com mais precisão "isso só funciona se ...".
Stephen C
18

Do javadoc

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

exemplo

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);
    }
}

Use-o quando o código espera uma lista somente leitura, mas você deseja passar apenas um elemento nela. singletonListé (thread) seguro e rápido.

salsinga
fonte
Obrigado, esta é a melhor resposta. Você até dá um exemplo em vez de simplesmente dizer "Claramente existem casos de uso, mas eu não os conheço".
theprogrammer 03/04
3

Para responder sua pergunta imutável:

Collections.singletonListcriará uma lista imutável. Uma lista imutável (também chamada de lista não modificável) não pode ter seu conteúdo alterado. Os métodos para adicionar ou remover itens lançarão exceções se você tentar alterar o conteúdo.

Uma lista única contém apenas esse item e não pode ser alterada.

ajain
fonte
2

Se uma coleção Immutable / Singleton se referir àquela que possui apenas um objeto e que não é mais modificada, a mesma funcionalidade pode ser alcançada criando uma coleção "UnmodifiableCollection" com apenas um objeto. Como a mesma coleção pode ser alcançada com a coleção Unmodifiable com um objeto, para qual finalidade especial a coleção Singleton serve?

Anónimo
fonte
Crie uma coleção não modificável com um objeto da maneira "normal" e usando o método singleton. Então você vê imediatamente o porquê.
kap
1

singletonList pode conter instância de qualquer objeto. O estado do objeto pode 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);

Não podemos definir unmodifiableList como acima.

Sarang
fonte