【问题标题】:Deciding between different approaches for instantiating a List<Foo> foo from fooService.getFoos()决定从 fooService.getFoos() 实例化 List<Foo> foo 的不同方法
【发布时间】:2010-09-25 19:01:02
【问题描述】:

如果fooService.getFoos() 返回List&lt;Foo&gt;

那么你可以这样写:

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

或者这个:

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

这两种方法产生的fooList 有什么显着差异吗?

【问题讨论】:

    标签: java list collections arraylist


    【解决方案1】:

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

    所以使用第一个选项。

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

    【讨论】:

    • 修改是问题 - 我不允许修改 getFoos 返回的列表。这就是为什么我认为我应该创建一个可以修改的新 ArrayList。
    【解决方案2】:

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

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

    这两个语句的结果将或多或少相同,除非:

    • 稍后您检查您的列表是否是ArrayList 的实例并强制转换它,但让我们面对现实吧,如果是这种情况,您将声明ArrayList&lt;Foo&gt;
    • fooService.getFoos() 返回的列表不应被修改(出于任何原因),但您仍希望在您身边修改列表中的元素(不影响原始列表)。

    资源:

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-28
          • 1970-01-01
          • 2012-01-25
          • 2018-04-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多