2010年9月15日 星期三

[Java]超好用的Varargs

Varargs 並不是新東西了,它在 JDK 1.5 就有提供了,但我卻是最近才知道 @_@"
所以這裡就分享給跟我一樣還沒不知的人


為什麼它會好用,先來看看以前沒用它時遇到了什麼問題

以前在寫 method 時,對於想要傳入的資料數量不是固定時,通常都是用 Array 或 Collections 來處理,例如
public class Test {
 public static void test(Object[] args){
  for( Object o:args ){
   System.out.println(o);
  }
 }
}

呼叫的方法例如
Test.test( new Object[]{"123","abc"} );

但這樣,若資料數量只有一兩個時,每次呼叫都還要去建立一個 Array,也是挺麻煩的
一天到晚打字,而且工作又有時程的壓力,所以就算少打幾個字也爽
這種時候,總是會想,能不能直接如下這樣呼叫
Test.test("123","abc");

所以,為了達到這個需求,我們會再用 Overloading 的方式,在 Test 中再加幾個 method
public class Test {
 public static void test(Object[] args){
  for( Object o:args ){
   System.out.println(o);
  }
 }
 public static void test(Object arg){
  test(new Object[]{arg});
 }
 public static void test(Object arg1,Object arg2){
  test(new Object[]{arg1,arg2});
 }
 public static void test(Object arg1,Object arg2,Object arg3){
  test(new Object[]{arg1,arg2,arg3});
 }
 //以此類推,想有幾個就寫幾個
}

這樣一來,呼叫的人是爽了沒錯,但卻累了提供 method 的人了
且這樣總還是有數量的限制

不過,現在提供 method 的人有福了,有了 Varargs,寫起來相當輕鬆
只要寫一個 method,就能達到上面所有需求
寫法幾乎就跟一開始的那個 method 一樣
public class Test {
 public static void test(Object... args){
  for( Object o:args ){
   System.out.println(o);
  }
 }
}
看出差別了嗎?參數型態不再是 Object[],而是 Object... ,關鍵就在於這個「...」
它就是 Varargs 語法,它就代表可以傳入任意數量的參數,或者是 Array

所以此時,除了可以這樣呼叫之外
Test.test( new Object[]{"123","abc"} );
也可以這樣呼叫
Test.test("123","abc");

是不是非~常的方便呢 *^____^* ,真是愛死它了

不過,在使用時要注意一點,同一個 method 中,這樣的參數只能有一個,且必須是在最後一個參數,例如
public static void test(String str,int num,Object... args){
 //...
}
不能這樣寫
public static void test(Object... args,String str,int num){
 //...
}
這樣寫連 compile 都不會過
因為這樣的話,在呼叫時,JVM 就不知道哪些參數算是 args 參數內的,哪些又是另外的
當然上述的例子我們用想的的話,是可以知道怎麼分辦,但也許 Java 有實作上的困難,尤其是像這樣
public static void test(Object... args1,Object... args2){
 //...
}
若呼叫時是這樣呼叫
Test.test("1","2","3");
這樣就真的無法分辦哪個歸 args1,哪個又歸 args2 了

沒有留言:

張貼留言

廣告訊息會被我刪除