【问题标题】:Returning an empty array返回一个空数组
【发布时间】:2011-10-10 11:20:31
【问题描述】:

我正在考虑返回空数组的最佳方式,而不是null

foo()bar()有什么区别吗?

private static File[] foo() {
    return Collections.emptyList().toArray(new File[0]);
}
private static File[] bar() {
    return new File[0];
}

【问题讨论】:

  • foo() 建议仅隐藏代码正在执行的操作。
  • @Carlos,我承认这很复杂,但这两种方法本质上是等价的,对吧?
  • 如果您忽略可读性,则等效...您可以使几乎所有事情复杂化。返回零的最佳方法是什么? return 15 - 3*5 + 0;?
  • @Carlos,点了!哈哈...
  • 请注意:foo() 将返回作为传递给toArray 的参数创建的数组!

标签: java arrays


【解决方案1】:

返回空数组的另一种方法是使用常量,因为给定类型的所有空数组都是相同的。

private static final File[] NO_FILES = {};
private static File[] bar(){
    return NO_FILES;
}

【讨论】:

  • 是的,这是我看到的另一种方式。我认为foo() 工作的事实让我有点迷失方向。而且我不确定引用常量是否有任何好处。我不知道……我想只是我缺乏经验。
  • +1:由于空数组是不可变的,这是最好的解决方案。
  • @Moonbeam,从性能的角度来看,这意味着您不需要每次都创建一个对象。
  • @Peter,话虽如此,foo() 会比bar() 更可取,您提供的解决方案在哪里是最佳的?
  • @Moonbeam,它仍然认为 foo() 做的比它需要做的要多,这可能会导致混淆它在做什么。通常情况下,人们可以假设a)额外的东西被放在那里是有原因的,并且需要花费一些时间才能找到不存在的东西,b)它做的工作比它需要的要多,即使它没有)
【解决方案2】:

foo()bar() 都可能在某些 IDE 中生成警告。例如,IntelliJ IDEA 会生成一个Allocation of zero-length array 警告。

另一种方法是使用带有空参数的 Apache Commons Lang 3 ArrayUtils.toArray() 函数:

public File[] bazz() {
    return ArrayUtils.toArray();
}

这种方法对性能和 IDE 都很友好,但需要第 3 方依赖项。但是,如果您的类路径中已经有 commons-lang3,您甚至可以将静态定义的空数组用于原始类型:

public String[] bazz() {
    return ArrayUtils.EMPTY_STRING_ARRAY;
}

【讨论】:

  • 这就是我要找的。谢谢。
【解决方案3】:

绝对是第二个。在第一个中,您使用常量空List<?>,然后将其转换为File[],这需要创建一个空File[0] 数组。这就是您在第二步中一步完成的操作。

【讨论】:

  • +1:第一个令人困惑。但它不会创建列表。 emptyList() 返回一个常量。
  • @Peter:谢谢,我不知道。我编辑了我的答案。我会给你 +1。
【解决方案4】:

您可以通过以下两种方式返回空数组:

如果你想返回 int 的数组,那么

  1. 使用{}

    int arr[] = {};
    return arr;
    
  2. 使用new int[0]

    int arr[] = new int[0];
    return arr;
    

同样,您也可以为其他数据类型返回数组。

【讨论】:

  • 或两者兼而有之:return new int[] {}
【解决方案5】:
return new File[0];

这是更好更有效的方法。

【讨论】:

  • 这根本不能回答问题。
  • 一个好的答案会解释为什么它更有效,因此读者可以验证它是正确的,并且更重要的是 - 适用于他们的情况。 (一个不好的评论声称缺陷可能是真实的,也可能不是真实的,正如你在“我猜不是”中所说的那样——这只是不文明的;这样的 cmets 往往会被版主标记并最终删除。)
【解决方案6】:

除了 foo 执行 3 个可见的方法调用来返回空数组之外没有区别,而 bar() 只是创建了这个数组并返回它。

【讨论】:

    【解决方案7】:

    我很确定你应该选择bar(); 因为使用foo(); 它会创建一个列表(一无所获),因为无论如何您最终都会创建一个新的 File[0],所以为什么不直接返回它!

    【讨论】:

      【解决方案8】:

      你可以在一行中做:

      private static File[] bar(){
          return new File[]{};
      }
      

      【讨论】:

      • new File[0]new File[]{} 相同,符号更少,我希望它编译为相同的字节码。
      猜你喜欢
      • 1970-01-01
      • 2020-02-11
      • 2018-08-06
      • 2021-08-11
      • 2021-07-24
      • 2014-01-27
      • 2019-04-27
      • 2015-07-10
      • 1970-01-01
      相关资源
      最近更新 更多