2011-07-21 32 views
36

SORU

Bu saçma bir soru olabilir, ancak foo() ve bar() arasında herhangi bir fark yoktur dönen?boş bir dizi


doğrusu null daha boş bir dizi döndürür en iyi şekilde düşünmeye çalışıyorum

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

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

KOD.

+1

'foo()' kod ne yaptığını gizlemek için sadece tavsiye edilir. –

+0

@Carlos, kıvrılmış olduğunu itiraf ediyorum, ancak iki yöntem aslında eşdeğerdir, değil mi? – Moonbeam

+4

eşdeğer okunabilirliği göz ardı ederseniz ... neredeyse her şeyi karmaşıklaştırabilirsiniz. Sıfırdan dönmenin en iyi yolu nedir? 'dönüş 15 - 3 * 5 + 0;'? –

cevap

62

Boş bir diziyi döndürmenin farklı bir yolu, belirli bir türdeki tüm boş diziler aynı olduğu için sabit kullanmaktır.

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

Evet, işin bittiğini gördüm. Bence foo(), beni biraz şaşırttı. Ve bir sabite başvurmanın herhangi bir yararı olup olmayacağından emin değildim. Bilmiyorum ... sadece deneyimim, sanırım. – Moonbeam

+0

+1: Boş bir dizi değişmez olduğundan, bu en iyi çözümdür. –

+0

@Moonbeam, Performans açısından bakıldığında, her seferinde bir nesne oluşturmanız gerekmediği anlamına gelir. –

14

Kesinlikle ikinci olanı. İlkinde, boş bir List<?> boş kullanın ve sonra boş bir File[0] dizisi oluşturmak için gereken bir File[] dönüştürün. Ve ikincisinde tek adımda yaptığınız şey budur.

+5

+1: İlki kafa karıştırıcı. Ama bir liste oluşturmuyor. EmptyList() bir sabit döndürür. –

+0

@Peter: Teşekkürler, bilmiyordum. Cevabımı düzenledim. Sana +1 vereceğim. –

1

Yalnızca, bu diziyi oluşturduğu ve döndürdüğü sırada, foo'nun her zaman oluşturulmuş boş diziyi döndürmek için 3 yöntem çağrısı çağrısı gerçekleştirmesi dışında hiçbir fark yoktur.

0

Ben (boşuna) bir listesi oluşturur bar(); foo(); ile çünkü zaten sonunda yeni bir dosya [0] oluşturmak beri gitmeli eminim, neden doğrudan bunları iade etmekte gitmez!

18
Hem foo()

ve bar() bazı IDE uyarılar oluşturabilir. Örneğin, IntelliJ IDEA bir Allocation of zero-length array uyarı üretecektir.

alternatif bir yaklaşım boş argümanlarla Apache Commons Lang 3 ArrayUtils.toArray() işlevini kullanmaktır:

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

Bu yaklaşım hem performans ve IDE dost, henüz 3. parti bağımlılığı gerektirir. Zaten sınıf yolunda commons-lang3 varsa, ancak, hatta ilkel türleri için statik olarak tanımlanmış boş diziler kullanabilirsiniz:

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