1. 程式人生 > >java——慎用可變參數列表

java——慎用可變參數列表

static 現在 col .class 使用 clas 編譯 pre sta

說起可變參數,我們先看下面代碼段,對它有個直觀的認識,下方的紅字明確地解釋了可變參數的意思:

 1 public class VarargsDemo{
 2     
 3     static int sum(int... args) {
 4         int sum = 0;
 5         for(int arg:args)
 6             sum += arg;
 7         return sum;
 8     }
 9     public static void main(String args[]) throws FileNotFoundException {
10 System.out.println(sum(1,2,3,4,5,6,7,8,9,10));
System.out.println(sum(1,2,3,4,5,6));
System.out.println(sum(1,2,3);
11 } 12 }

可變參數的機制原理:

1.創建一個array[],它的size就是所傳參數的個數;

2.將參數放入到array[]中;

3.將array[]傳給方法。

看起來這個可變參數非常的便利,我們不用去考慮參數的個數,隨心所欲的使用。但是這個觀點不對,它給我帶來便利的同時,也有很多潛在的危險,我們要慎重使用。

1.如果所傳參數為null,方法裏有對參數的引用(比如 args[0])時,那麽就會在運行時失敗(編譯時卻檢測不出錯誤);

2.在對性能有要求時,我們要慎重考慮是否使用可變參數。因為,可變參數方法的調用都會引起array的內存分配和初始化,這會給性能帶來損耗。

解決方案:

假設調用可變參數的方法中,有95%只是調用參數個數小於4,那麽就可以將個數小於4的方法,用普通方法定義;剩余的5%,調用可變參數方法。

1     public void foo() {}
2     public void foo(int a1) {}
3     public void foo(int a1, int
a2) {} 4 public void foo(int a1, int a2, int a3) {} 5 public void foo(int a1, int a2, int a3, int... rest) {}

3.在打包作業時,還有一點需要註意。

當可變參數的使用發生變動時(比如:以前用可變參數方法,現在用普通方法),所有引用參數列表的類的.class都要重新生成,因為可變參數的array的分配和初始化是在編譯期間完成的。

參考文獻:

《Effective Java》 第三版 Item 53

java——慎用可變參數列表