2021/03/23

[筆記] Effective Java #53 慎用可變參數

Effective Java 3rd 簡體中文版筆記 #53 慎用可變參數
可變參數方法 (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

沒有留言:

張貼留言