程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 解析Java的可變長參數列表及其應用時的留意點

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

編輯:關於JAVA

解析Java的可變長參數列表及其應用時的留意點。本站提示廣大學習愛好者:(解析Java的可變長參數列表及其應用時的留意點)文章只能為提供參考,不一定能成為您想要的結果。以下是解析Java的可變長參數列表及其應用時的留意點正文


Java 可變參數列表


class A {}


因為一切的類都繼續於Object,可以以Object數組為參數的辦法:

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以後版本添加了特征可以如斯寫:

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認為的參數列表:

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操作的處所,根本上至多須要封閉兩個流:輸出、輸入,我愛好把流封閉的操作封裝成上面的辦法,如許只需一次挪用便可以封閉多個流。

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 類型的。

第一個坑就是在這個辦法內取可變長參數的元素時,沒斟酌到有的參數是沒傳的,直接爆數組越位的異常了。立時就認為可變長參數列表的欠好了,那就不消了呗,改成慣例的固定情勢的參數傳遞。

改完以後,在測試情況測了都沒成績。把臨盆情況的幾個類調換以後,成果卻報錯了,辦法找不到,一看辦法簽名,照樣數組的,沒有調換到。從源碼看,誰人挪用的處所不須要更改,所以沒想到要調換;因為測試情況是全量打包,所以不會湧現成績。

辦法的簽名是在編譯的時刻就肯定了的,源碼層面看起來不須要改的不表現編譯後的類也不須要調換了。

其實之前也聽到過,在這類發包不標准的情形下,把源碼裡的一個常量值改了以後,只調換了這個界說常量的類文件,沒有把一切援用這個常量的類文件從新編譯調換,招致湧現莫明其妙的成績。跟辦法簽名的情形實質上是一樣的成績。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved