Effective Java - Use varargs judiciously

varargs在我看這個item之前,我用的習以為常:

public String appendStrings(String ...strs) {
	StringBuilder sb = new StringBuilder();
	for( String str : strs ) {
		sb.append(str);
	}
	return sb.toString();
}
後來某天和同事討論到strs輸入檢查的問題時,就回來翻閱了這個item。假如你要限制client必須輸入一個或多個參數時,在method內做限制檢查並不是一個好的設計;書中建議做法可以如下:
public static String appendStrings(String first, String ...strs) {
	StringBuilder sb = new StringBuilder(first);
	for( String str : strs ) {
		sb.append(str);
	}
	return sb.toString();
}
透過限制必須傳入一個參數的方式,可以降低有人傳空資料的機會。除此之外,書中提到使用這種方式可能會導致效能問題,因為每次的呼叫JVM都會針對內容做array的allocation與initialization。從網路上別人做實驗的文章中發現,速度大概慢了60倍

針對client的呼叫有95%的機會少於三個參數的人,書中給了以下workaround:
public void foo() { }
public void foo(int a1) { }
public void foo(int a1, int a2) { }
public void foo(int a1, int a2, int a3) { }
public void foo(int a1, int a2, int a3, int... rest) { }
還特別舉了JDK中的EnumSet,有使用到這個技術..

Effective Java第三版Item 53。

  • Effective Java, 3/e