使用Java的Collections.singletonList()?

Pla*_*mer 147 java

Collections.singletonList()在Java中有什么用?据我所知,它返回一个包含一个元素的列表.为什么我想要一个单独的方法来做到这一点?不变性如何在这里发挥作用?

这个方法有没有特别有用的用例,而不仅仅是一个方便的方法?

Ste*_*n C 141

javadoc中这样说:

"返回仅包含指定对象的不可变列表.返回的列表是可序列化的."

你问:

为什么我想要一个单独的方法来做到这一点?

为方便起见......为了节省您必须编写一系列语句:

  • 创建一个空列表对象
  • 添加一个元素,和
  • 用一个不可变的包装器包装它.

不变性如何在这里发挥作用?

它是该方法规范的一部分; 往上看.

这种方法有没有特别有用的用例,而不仅仅是一种方便的方法?

显然,存在使用该singletonList方法方便的用例.但我不知道你会如何(客观地)区分普通用例和"特别有用"用例......

  • 它来自数学:“Singleton ... 5:数学。由一个给定元素组成的集合。” 来源:https://www.dictionary.com/browse/singleton。另外https://en.wikipedia.org/wiki/Singleton_(数学)。 (2认同)

Jim*_*ans 25

这是关于单例方法的一个视图:

我发现这些各种"单例"方法对于将单个值传递给需要该值集合的API非常有用.当然,当处理传入值的代码不需要添加到集合时,这最有效.

  • 我认为他指的是无法修改传入列表,因为它是一个不可变的列表. (2认同)
  • @BilboBaggins - 这句话很讽刺。:-) 短语“这在...时效果最佳”更准确地写成“这仅在...时才有效”。 (2认同)

sal*_*nga 14

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当代码需要只读列表时使用它,但您只想在其中传递一个元素.singletonList是(线程)安全和快速.

  • 谢谢,这是更好的答案。您甚至可以举一个例子,而不是简单地说“显然有用例,但我不知道它们”。 (2认同)

小智 6

回答你不变的问题:

Collections.singletonList将创建一个不可变的列表。不可变列表(也称为不可修改列表)不能更改其内容。如果您尝试更改内容,添加或删除项目的方法将引发异常。

单例列表仅包含该项目且不能更改。