从fooService.getFoos()</foo>中确定实例化List <foo> foo的不同方法之间的决定

时间:2010-09-25 19:01:02

标签: java list collections arraylist

如果fooService.getFoos()返回List<Foo>

然后你可以这样写:

List<Foo> fooList = fooService.getFoos();

或者这个:

List<Foo> fooList = new ArrayList(fooService.getFoos());

这两种方法之间产生的fooList是否存在显着差异?

4 个答案:

答案 0 :(得分:1)

第二个并不是一个好主意,因为你省略了通用部分。

但主要问题是将要调用的不必要的代码。您可以查看ArrayList代码源,您将看到构造函数中使用的所有操作。如果您只需要一个List,并且fooService.getFoos()返回一个有效的List,那么您应该坚持使用它。

这两个陈述的结果大致相同,除非:

  • 稍后你会检查你的列表是否是ArrayList的实例并进行投射,但让我们面对它,如果是这样的话,你会声明ArrayList<Foo>
  • fooService.getFoos()返回的列表不应该被修改(出于任何原因),但是你仍然需要修改列表中的元素(不影响原始列表)。

资源:

答案 1 :(得分:1)

是的 - 您正在创建一个全新的List,其中包含原始元素。您正在复制内存中的集合,并从头到尾迭代它。您也没有使用该服务提供的实例,也无法修改原始实例。最后,您已在第二个代码段中省略了泛型声明。

所以使用第一个选项。

更新:您表示不允许修改原始列表。这实际上是fooService的问题,而不是客户的问题。如果服务也在您的控制范围内,则返回Collections.unmodifiableList(originalList) - 因此客户端将无法执行修改操作(尝试时将抛出异常)

答案 2 :(得分:0)

我坚持使用第一个,因为它比第二个更容易阅读并且更有意义。

答案 3 :(得分:0)

在第二个语句中,它仅返回List类型。如果你确定方法返回相同类型的den,你可以使用第一种类型。