2008-10-06 86 views
5

考慮以下方法簽名:Object數組

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

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

說明:前者以富-對象數組作爲參數 - fooMethod(new Foo[]{..}) - 而後者接受任意數量的Foo類型的參數,並將其作爲方法內的Foo:s數組顯示 - fooMethod(fooObject1, fooObject2, etc...)。

如果兩者都被定義,則Java會拋出適當的聲明,聲稱它們是重複的方法。我做了一些偵探工作,發現第一個聲明確實需要一個明確的Foo對象數組,並且這是調用該方法的唯一方法。第二種方法實際上接受任意數量的Foo參數,並接受Foo對象的數組。

所以,問題是,由於後一種方法似乎更加靈活,是否有任何理由使用第一個例子,或者我錯過了任何重要的東西?

+0

不知道Java,這是黑暗中的刺,但我認爲第一個效率稍微高一點,因爲:a)你可能只會傳遞一個指針,並且b)你會將一個指針傳遞給內存的一個連續部分。 – 2008-10-06 12:11:30

+0

@monoxide:不,這兩種形式都會生成等效的調用字節碼,這兩種形式都需要構建一個數組才能通過。 – 2008-10-06 12:13:58

+0

第二種形式是第一種語法糖。所以,fooMethod(new Foo(1),new Foo(2))在這裏與fooMethod(new Foo [] {new Foo(1),new Foo(2)}相同 – 2008-10-06 12:14:51

回答

12

這些方法實際上是相同的。

此功能被稱爲可變參數,它是一個編譯器功能。幕後是翻譯成以前的版本。

如果您定義了一個接受Object ...的方法併發送了一個Object []類型的參數,那麼就有一個缺陷!

1

後者是在Java 5中引入的,現有的庫正逐漸被重新加以支持。您仍然可以使用前者來強調該方法需要2+輸入,此外還有對可以使用的位置的限制。

0

確實沒有性能問題或類似的問題需要考慮,因此歸結爲語義。

您是否期望您的方法的調用者有一個Foo的數組準備在手?然後使用Foo []版本。使用可變參數變體來強調有一堆「Foo's」而不是一個數組的可能性。

的可變參數一個典型例子北京時間字符串格式(在C#中,不知道它在Java中怎麼叫):

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

在這裏,你所期望的參數傳遞給不同類型的,所以有一個參數數組將是非常不尋常的,因此可變參數變體。使用數組

上的東西另一方面像

string Join(string[] substrings, char concatenationCharacter) 

是完全合理的。

另請注意,您可以在參數列表末尾有多個數組參數和只有一個可變參數參數。

3

我想補充Shimi的解釋,補充說可變參數語法的另一個限制是可變參數必須是最後聲明的參數。所以你不能這樣做:

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

這意味着任何給定的方法只能有一個可變參數。在你想傳遞多個數組的情況下,你可以只使用可變參數中的一個。

在實踐中,當您將參數視爲任意數量的不同值時,可變參數值處於最佳狀態,而不是數組。 Java5將它們映射到數組只是因爲這是最方便的事情。

一個很好的例子是String.format()。這裏,可變參數與第一個參數中的格式佔位符相匹配。

相關問題