zoukankan      html  css  js  c++  java
  • java——慎用可变参数列表

    说起可变参数,我们先看下面代码段,对它有个直观的认识,下方的红字明确地解释了可变参数的意思:

     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, int a2) {}
    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中关于时间日期格式保存到mysql的问题
    传输json数据到前台的时候,数据中包含日期数据
    字符串的分隔方法 split()
    实体类中用基本类型好,还是用包装类型
    Android中的task和stack
    在res文件下新建文件夹
    Android活动和碎片的生命周期及addToBackStack()方法
    draw9patch图片拉伸
    Android studio新建文件出现setContentView(R.layout.activity_main);中的R标红错误解决方法
    listview控件的使用
  • 原文地址:https://www.cnblogs.com/lihao007/p/10325855.html
Copyright © 2011-2022 走看看