可變參數方法 (variable arity method),它接受 0 個或者多個參數。sum() 沒有傳入參數時,結果是 0,而 sum(1, 2, 3) 的結果為 6。
static int sum(int... args) {
int sum = 0;
for (int arg : args)
sum += arg;
return sum;
}
如果一方法,目的為找出數列中的最小值,方法如果使用可變參數。若是調用者沒有傳入參數,那程式會在運行時才會丟出例外。// The WRONG way to use varargs to pass one or more arguments!
static int min(int... args) {
if (args.length == 0)
throw new IllegalArgumentException("Too few arguments");
int min = args[0];
for (int i = 1; i < args.length; i++)
if (args[i] < min)
min = args[i];
return min;
}
上述的設計不太好,應該將方法改成兩個傳入參數,第一個為一般參數,第二個為可變參數。static int min(int firstArg, int... remainingArgs) {
int min = firstArg;
for (int arg : remainingArgs)
if (arg < min)
min = arg;
return min;
}
如果對效能有要求,可能要小心使用可變參數,因為每次調用都會進行陣列的生成。如果確定該方法的使用情境,95% 都是傳入 3 個以下的參數,那麼可以提供下列的 API,減少可變參數方法被調用的機率。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) { }
轉載請註明原文網址 https://cookieandcoketw.blogspot.com/2021/03/effective-java-53-varargs.html
沒有留言:
張貼留言