【问题标题】:Object arrays in method signatures方法签名中的对象数组
【发布时间】:2010-09-15 11:58:50
【问题描述】:

考虑以下方法签名:

public fooMethod (Foo[] foos) { /*...*/ }

public fooMethod (Foo... foos) { /*...*/ }

解释:前者采用 Foo 对象数组作为参数 - fooMethod(new Foo[]{..}) - 而后者采用任意数量的 Foo 类型参数,并将它们呈现为 Foo:s 的数组方法 - fooMethod(fooObject1, fooObject2, etc...)。

如果两者都被定义,Java 会抛出一个 fit,声称它们是重复的方法。我做了一些侦探工作,发现第一个声明确实需要一个显式的 Foo 对象数组,这是调用该方法的唯一方法。第二种方式实际上既接受任意数量的 Foo 参数,也接受一个 Foo 对象数组。

所以,问题是,由于后一种方法似乎更灵活,是否有任何理由使用第一个示例,还是我错过了任何重要的东西?

【问题讨论】:

  • 不了解 Java,这是在黑暗中的一次尝试,但我认为第一个效率更高一些,因为:a) 您可能只会传递一个指针,并且 b ) 你将传递一个指向内存连续部分的指针。
  • @monoxide:不,两种形式都生成等效的调用字节码,两种形式都需要构建一个数组才能传递。
  • 第二种形式只是第一种形式的语法糖。所以, fooMethod(new Foo(1), new Foo(2)) 在这里等同于 fooMethod(new Foo[] {new Foo(1), new Foo(2)})

标签: java arrays methods


【解决方案1】:

这些方法其实是一样的。

此功能称为可变参数,它是一个编译器功能。幕后是翻译成以前的版本。

如果您定义了一个接受 Object... 的方法并且您发送了一个 Object[] 类型的参数,则会有一个陷阱!

【讨论】:

  • Java 会对此发出警告,并要求您写入 (Object) 数组(用于可变参数模式)或 (Object[]) 数组(用于非可变参数模式)。 :-)
【解决方案2】:

我想在 Shimi 的解释中补充一点,可变参数语法的另一个限制是可变参数必须是最后声明的参数。所以你不能这样做:

void myMethod(String... values, int num);

这意味着任何给定的方法都只能有一个可变参数。如果你想传递多个数组,你可以只对其中一个使用可变参数。

在实践中,当您将参数视为任意数量的不同值而不是数组时,可变参数处于最佳状态。 Java5 将它们映射到一个数组只是因为这是最方便的做法。

一个很好的例子是 String.format()。在这里,可变参数与第一个参数中的格式占位符匹配。

【讨论】:

    【解决方案3】:

    后者是在 Java 5 中引入的,并且正在逐步对现有库进行改造以支持它。您可能仍然使用前者来强调该方法需要 2+ 输入,而且 ... 的使用位置存在限制。

    【讨论】:

    • 除了它不强调任何类型,实际上允许 0 或 1 个输入(除非文档中另有说明,在这种情况下,可变参数形式同样好)。
    【解决方案4】:

    当然没有性能问题或类似的事情需要考虑,所以它归结为语义。

    您是否希望您的方法的调用者手头有一个 Foo 数组?然后使用 Foo[] 版本。使用 varargs 变体来强调使用 Foo 的“一堆”而不是数组的可能性。

    varargs 的经典示例是字符串格式(在 C# 中,不知道它在 Java 中是如何调用的):

    string Format(string formatString, object... args)
    

    这里你期望 args 是不同的类型,所以有一个参数数组是非常不常用的,因此 varargs 变体。

    另一方面,像

    string Join(string[] substrings, char concatenationCharacter)
    

    使用数组是完全合理的。

    另请注意,您可以在参数列表末尾有多个数组参数和一个可变参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 2013-02-24
      相关资源
      最近更新 更多