创建集合的副本

St.*_*rio 4 java collections copy list

我正在阅读J. Bloch的有效Java,现在我正在关于避免返回nulls,但返回空集合的部分.这是该部分的代码示例:

// The right way to return a copy of a collection
public List<Cheese> getCheeseList() {
  if (cheesesInStock.isEmpty())
    return Collections.emptyList(); // Always returns same list
  else
    return new ArrayList<Cheese>(cheesesInStock);
}
Run Code Online (Sandbox Code Playgroud)

我真的无法理解只返回cheesesInStockif 有什么问题cheesesInStock.isEmpty().为什么返回预定义更好Collections.emptyList().如果我们返回,我们可能遇到什么样的麻烦cheesesInStock.

Bob*_*der 7

如果方法返回cheesesInStock- 调用者可能会在列表中添加一些奶酪.

这可能是一种不好的做法,因为您可能希望控制添加过程.


Jor*_*lla 5

因为

  • 您将使用Collections.emptyList();具有单例模式的资源来节省资源.
  • 它是类型安全的
  • list是不可变的(不能修改)

另外,您可以查看API:

返回空列表(不可变).此列表是可序列化的.

此示例说明了获取空列表的类型安全方法:

 List<String> s = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)

实现说明:此方法的实现不需要为每个调用创建单独的List对象.使用此方法可能具有与使用类似命名字段相当的成本.(与此方法不同,该字段不提供类型安全性.)


Sle*_*idi 5

这里的想法更多是关于安全对象发布或共享,返回对可变列表的引用允许调用者改变原始列表,这通常是一个坏主意.如果列表或对象通常是不可变的,那么您不需要这样做,例如String是不可变的,因此共享它是安全的.

String getString(){
  return someString; // no need to copy
}
Run Code Online (Sandbox Code Playgroud)

共享可变状态带来两个主要问题:

  1. 当事物可以从任何地方变异时,很难检查程序的正确性.
  2. 线程安全变得更难,因为它需要同步,这通常是困难且昂贵的.