2011-07-21 160 views
36

問題

這可能是一個愚蠢的問題,但有foo()bar()之間的任何差異?返回一個空數組


CODE

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

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

我試圖想返回一個空數組,而不是null的最佳途徑。

+1

'FOO()只建議'隱藏什麼代碼正在做什麼。 –

+0

@Carlos,我承認這很複雜,但這兩種方法基本上是等價的,對嗎? – Moonbeam

+4

等效如果你忽略可讀性......你幾乎可以把所有東西都複雜化。什麼是最好的方式返回零? '返回15 - 3 * 5 + 0;'? –

回答

62

返回空數組的另一種方法是使用常量,因爲給定類型的所有空數組都是相同的。

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

是的,這是我看到完成的另一種方式。我認爲'foo()'讓我感到迷惑了一下。而且我不確定提及常數是否會有任何好處。我不知道,只是我的經驗不足,我想。 – Moonbeam

+0

+1:由於空數組是不可變的,所以這是最好的解決方案。 –

+0

@Moonbeam,從性能的角度來看,這意味着你不需要每次創建一個對象。 –

14

絕對是第二個。在第一個中,您使用一個常量爲空的List<?>,然後將其轉換爲File[],這需要創建一個空的File[0]陣列。這就是你在第二步中所做的一步。

+5

+1:第一個令人困惑。但它不會創建一個列表。 emptyList()返回一個常量。 –

+0

@彼得:謝謝,我不知道。我編輯了我的答案。我會給你+1。 –

1

除了foo執行3個可見的方法調用以返回空數組,而bar()只是創建該數組並返回它時,創建的數組完全沒有區別。

0

我敢肯定,你應該去bar(); 因爲foo();它創建一個List(白白),因爲你在創建末尾的新文件[0]無論如何,所以爲什麼不直接返回它去吧!

18

兩個foo()bar()可能會產生一些IDE的警告。例如,IntelliJ IDEA將生成一個Allocation of zero-length array警告。

另一種方法是使用Apache Commons Lang中3 ArrayUtils.toArray()函數與空參數:

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

這種做法是性能和IDE友好的,但需要一個第三方的依賴。但是,如果你已經有公地lang3在類路徑中,你甚至可以使用靜態定義的空數組基本類型:

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