一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 解析Java的可變長參數列表及其使用時的注意點

解析Java的可變長參數列表及其使用時的注意點

2020-04-10 15:20wen866595 JAVA教程

這篇文章主要介紹了解析Java的可變參數列表及其使用時的注意點,注意可變參數必須位于最后一項,需要的朋友可以參考下

Java 可變參數列表

 

復制代碼 代碼如下:

class A {}

 

 


由于所有的類都繼承于Object,可以以Object數組為參數的方法:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class parameter {
  static void printArray(Object[] args){
    for(Object obj : args){
      System.out.print(obj + " ");
    }
    System.out.println();
  }
  
  public static void main(String[] args){
    printArray(new Object[] {
        new Integer(47), new Float(3.14), new Double(11.11)
    });
    printArray(new Object[]{"one", "two", "there"});
    printArray(new Object[]{new A(), new A(), new A()});
  }
}

對于Java SE5之后版本添加了特性可以如此寫:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class parameter {
  public static void printArray(Object... args){
    for(Object obj : args){
      System.out.print(obj + " ");
    }
    System.out.println();
  }
  
  public static void main(String[] args){
    printArray(new Integer(47), new Float(3.14), new Double(11.11));
    printArray(47, 3.14F, 11.11);
    printArray("one", "two", "three");
    printArray(new A(), new A(), new A());
    printArray((Object[]) new Integer[]{1, 2, 3, 4});
    printArray();
  }
}

可以使用Object以為的參數列表:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class VarargType{
  static void f(Character... args){
    System.out.print(args.getClass());
    System.out.println(" length " + args.length);
  }
  
  static void g(int... args){
    System.out.print(args.getClass());
    System.out.println(" length " + args.length);
  }
  
  public static void main(String[] args){
    f('a');
    f();
    g(1);
    g();
    System.out.println(" int [] " + new int[0].getClass());
  }
}

這是 Java 5 引入的一個特性,如果一個方法要接收的參數數量是不確定的,那么這個特性就可以派上用場了。

比如,在涉及IO操作的地方,基本上至少需要關閉兩個流:輸入、輸出,我喜歡把流關閉的操作封裝成下面的方法,這樣只需一次調用就可以關閉多個流。

?
1
2
3
4
5
6
7
8
9
10
public static void closeSilent(Closeable... closeables) {
   for (Closeable closeable : closeables) {
     if (closeable != null) {
        try {
          closeable.close();
        } catch (IOException ignored) {
        }
     }
   }
}

這是我覺得這個特性唯一適合使用的地方,具備下面的特點:

這些參數具有相同的類型;
參數數量不確定,每一個都是可選的;
這些參數的用途都是一樣的,比如上面都是執行關閉。
Java 可變長參數列表只能放在方法參數列表的最后。


Java可變長參數列表的實現

Java可變長參數列表的實現是通過編譯器把把這些參數封裝成一個數組來傳遞的。

比如上面的方法的簽名實際上是: closeSilent(Closeable[] closeables) void 。

踩坑

有個方法,被 A、B 兩個地方 A、B 調用,9 月,在 A 這里需要增加一個參數,當時腦子一抽瘋,決定用可變長參數列表,覺得 B 那里不用改簡單點,坑就這樣埋下了。

最近要求 B 這里要新增兩個參數,那就在方法的參數列表里繼續加參數,這些參數的類型是不同的,所以可變長參數列表聲明成 Object 類型的。

第一個坑就是在這個方法內取可變長參數的元素時,沒考慮到有的參數是沒傳的,直接爆數組越位的異常了。馬上就覺得可變長參數列表的不好了,那就不用了唄,改為常規的固定形式的參數傳遞。

改完之后,在測試環境測了都沒問題。把生產環境的幾個類替換之后,結果卻報錯了,方法找不到,一看方法簽名,還是數組的,沒有替換到。從源碼看,那個調用的地方不需要更改,所以沒想到要替換;由于測試環境是全量打包,所以不會出現問題。

方法的簽名是在編譯的時候就確定了的,源碼層面看起來不需要改的不表示編譯后的類也不需要替換了。

其實以前也聽到過,在這種發包不規范的情況下,把源碼里的一個常量值改了之后,只替換了這個定義常量的類文件,沒有把所有引用這個常量的類文件重新編譯替換,導致出現莫名其妙的問題。跟方法簽名的情況本質上是一樣的問題。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91频视 | 搡60一70岁的老女人小说 | 国产永久免费爽视频在线 | 蜜桃影像传媒推广 | 99久久精品国语对白 | 护士让我吃奶我扒她奶 | 天美传媒tm0065 | 王淑兰李思雨李铁柱乡村小说免费 | 久久精品成人免费网站 | 动漫美女被褥吸奶漫画漫画 | 亚洲AV无码专区国产精品麻豆 | 日韩欧美国产一区二区三区 | 99精品免费在线 | 欧美日韩精品一区二区三区高清视频 | 操久| 特级淫片大乳女子高清视频 | 青青视频国产依人在线 | 2022国产麻豆剧果冻传媒入口 | 日本免费三片在线观看 | 91精品国产高清久久久久久io | 国内会所按摩推拿国产 | 国产精品女主播自在线拍 | 香港日本三级亚洲三级 | 国产亚洲福利精品一区二区 | 国产亚洲精品网站 | 国产一区视频在线免费观看 | 欧美在线观看视频一区 | 扒开老师两片湿漉的肉 | 99精品国产综合久久久久 | 精品无码国产污污污免费网站2 | 精品视频在线观看 | 欧美日韩一品道 | 小鸟酱在线看 | 国产成人精品免费久久久久 | 污到湿的爽文免费阅读 | 男人狂擦女人的下面视频 | 被老外操 | 男同gay玩奴男同玩奴 | 日韩免费观看成第15集 | 日本www视频在线观看 | 久久亚洲成a人片 |