java——慎用可變參數列表
阿新 • • 發佈:2019-01-27
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, inta2) {} 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——慎用可變參數列表