在Java中Collections.singletonList()的用途是什么?我知道它返回一个只有一个元素的列表。我为什么要用单独的方法来做呢?不变性在这里扮演了怎样的角色?
除了作为一个方便的方法,这个方法还有什么特别有用的用例吗?
在Java中Collections.singletonList()的用途是什么?我知道它返回一个只有一个元素的列表。我为什么要用单独的方法来做呢?不变性在这里扮演了怎样的角色?
除了作为一个方便的方法,这个方法还有什么特别有用的用例吗?
当前回答
如果一个Immutable/Singleton集合指的是一个只有一个对象并且不会被进一步修改的集合,那么同样的功能可以通过使一个只有一个对象的集合“UnmodifiableCollection”来实现。既然使用一个对象的不可修改集合可以实现相同的功能,那么单例集合的特殊用途是什么呢?
其他回答
如果一个Immutable/Singleton集合指的是一个只有一个对象并且不会被进一步修改的集合,那么同样的功能可以通过使一个只有一个对象的集合“UnmodifiableCollection”来实现。既然使用一个对象的不可修改集合可以实现相同的功能,那么单例集合的特殊用途是什么呢?
来自javadoc
@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);
}
}
当代码需要一个只读列表,但您只想在其中传递一个元素时使用它。singletonList是(线程)安全且快速的。
singletonList可以保存任何对象的实例。对象状态可以修改。
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);
我们不能像上面那样定义unmodifiableList。
javadoc说:
"返回只包含指定对象的不可变列表。返回的列表是可序列化的。”
你问:
我为什么要用单独的方法来做呢?
主要是为了方便……为了节省你必须写一个语句序列:
创建一个空列表对象 向它添加一个元素,然后 用一个不可变的包装器包装它。
它也可能更快一点和/或节省一些内存,但这些小的节省不太可能是显著的。(至少可以说,创建大量单例列表的应用程序是不寻常的。)
不变性在这里扮演了怎样的角色?
它是方法规范的一部分;见上图。
这个方法有什么特别有用的用例,而不仅仅是一个方便的方法吗?
显然,在一些用例中使用singletonList方法很方便。实际上,任何需要使用包含一个元素的不可变列表的程序都是有效的用例。(几乎不需要任何想象力就能想出一个。)
但是我不知道你如何(客观地)区分一个普通的用例和一个“特别有用的”用例……
下面是关于单例方法的一个观点:
我发现这些不同的“单例”方法对于将单个值传递给需要该值集合的API非常有用。当然,当处理传入值的代码不需要添加到集合中时,这样做效果最好。