欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解析Java的可變長(zhǎng)參數(shù)列表及其使用時(shí)的注意點(diǎn)

 更新時(shí)間:2016年03月15日 08:54:16   作者:wen866595  
這篇文章主要介紹了解析Java的可變參數(shù)列表及其使用時(shí)的注意點(diǎn),注意可變參數(shù)必須位于最后一項(xiàng),需要的朋友可以參考下

Java 可變參數(shù)列表

復(fù)制代碼 代碼如下:

class A {}


由于所有的類都繼承于Object,可以以O(shè)bject數(shù)組為參數(shù)的方法:

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()});
  }
}

對(duì)于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以為的參數(shù)列表:

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 引入的一個(gè)特性,如果一個(gè)方法要接收的參數(shù)數(shù)量是不確定的,那么這個(gè)特性就可以派上用場(chǎng)了。

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

public static void closeSilent(Closeable... closeables) {
   for (Closeable closeable : closeables) {
     if (closeable != null) {
        try {
          closeable.close();
        } catch (IOException ignored) {
        }
     }
   }
}

這是我覺得這個(gè)特性唯一適合使用的地方,具備下面的特點(diǎn):

這些參數(shù)具有相同的類型;
參數(shù)數(shù)量不確定,每一個(gè)都是可選的;
這些參數(shù)的用途都是一樣的,比如上面都是執(zhí)行關(guān)閉。
Java 可變長(zhǎng)參數(shù)列表只能放在方法參數(shù)列表的最后。


Java可變長(zhǎng)參數(shù)列表的實(shí)現(xiàn)

Java可變長(zhǎng)參數(shù)列表的實(shí)現(xiàn)是通過(guò)編譯器把把這些參數(shù)封裝成一個(gè)數(shù)組來(lái)傳遞的。

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

踩坑

有個(gè)方法,被 A、B 兩個(gè)地方 A、B 調(diào)用,9 月,在 A 這里需要增加一個(gè)參數(shù),當(dāng)時(shí)腦子一抽瘋,決定用可變長(zhǎng)參數(shù)列表,覺得 B 那里不用改簡(jiǎn)單點(diǎn),坑就這樣埋下了。

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

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

改完之后,在測(cè)試環(huán)境測(cè)了都沒問(wèn)題。把生產(chǎn)環(huán)境的幾個(gè)類替換之后,結(jié)果卻報(bào)錯(cuò)了,方法找不到,一看方法簽名,還是數(shù)組的,沒有替換到。從源碼看,那個(gè)調(diào)用的地方不需要更改,所以沒想到要替換;由于測(cè)試環(huán)境是全量打包,所以不會(huì)出現(xiàn)問(wèn)題。

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

其實(shí)以前也聽到過(guò),在這種發(fā)包不規(guī)范的情況下,把源碼里的一個(gè)常量值改了之后,只替換了這個(gè)定義常量的類文件,沒有把所有引用這個(gè)常量的類文件重新編譯替換,導(dǎo)致出現(xiàn)莫名其妙的問(wèn)題。跟方法簽名的情況本質(zhì)上是一樣的問(wèn)題。

相關(guān)文章

  • SpringBoot配置項(xiàng)目訪問(wèn)路徑URL的根路徑方式

    SpringBoot配置項(xiàng)目訪問(wèn)路徑URL的根路徑方式

    這篇文章主要介紹了SpringBoot配置項(xiàng)目訪問(wèn)路徑URL的根路徑方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • spring定時(shí)任務(wù)執(zhí)行兩次及tomcat部署緩慢問(wèn)題的解決方法

    spring定時(shí)任務(wù)執(zhí)行兩次及tomcat部署緩慢問(wèn)題的解決方法

    這篇文章主要給大家介紹了關(guān)于spring定時(shí)任務(wù)執(zhí)行兩次及tomcat部署緩慢問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Java前后端分離項(xiàng)目跨域問(wèn)題解決方案

    Java前后端分離項(xiàng)目跨域問(wèn)題解決方案

    本文主要介紹了Java前后端分離項(xiàng)目跨域問(wèn)題解決方案,其中后端基于SpringBoot,前端使用了jQuery、axios等框架,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • spring boot如何指定啟動(dòng)端口

    spring boot如何指定啟動(dòng)端口

    這篇文章主要介紹了spring boot如何指定啟動(dòng)端口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • MyBatis-Plus框架整合詳細(xì)方法

    MyBatis-Plus框架整合詳細(xì)方法

    MyBatis-Plus是一個(gè) MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生這篇文章主要介紹了MyBatis-Plus框架整合,需要的朋友可以參考下
    2022-04-04
  • JAVA 開發(fā)之用靜態(tài)方法返回類名的實(shí)例詳解

    JAVA 開發(fā)之用靜態(tài)方法返回類名的實(shí)例詳解

    這篇文章主要介紹了JAVA 開發(fā)之用靜態(tài)方法返回類名的實(shí)例詳解的相關(guān)資料,這里主要說(shuō)明使用異常來(lái)得到類名,希望能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • SpringMVC請(qǐng)求亂碼處理的2種方式

    SpringMVC請(qǐng)求亂碼處理的2種方式

    這篇文章主要介紹了SpringMVC請(qǐng)求亂碼處理的2種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 深入探究Java中的HashMap為什么會(huì)產(chǎn)生死循環(huán)

    深入探究Java中的HashMap為什么會(huì)產(chǎn)生死循環(huán)

    HashMap?死循環(huán)發(fā)生在?JDK?1.8?之前的版本中,這篇文章主要來(lái)和大家深入探究一下為什么Java中HashMap會(huì)產(chǎn)生死循環(huán),感興趣的小伙伴可以了解一下
    2023-05-05
  • Java 字符串連接的性能問(wèn)題分析

    Java 字符串連接的性能問(wèn)題分析

    這篇文章主要介紹了Java 字符串連接的性能問(wèn)題分析的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • spring boot中nativeQuery的用法

    spring boot中nativeQuery的用法

    這篇文章主要介紹了spring boot中nativeQuery的作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07

最新評(píng)論