java代码编写出现的陷阱-1:警戒变长参数

在Java5 中提供了变长参数(varargs),也就是在方法定义中可使用个数不肯定的参数,对于同一方法可使用不一样个数的参数调用,调用的时候能够给出任意多个参数也可不给参数.java

method(Object...objs){...} .  调用时的代码是:method("str") 或者method(null),method("张三","李四","王五").数组

可是若是出现下面的状况,可就麻烦了,很少说,看代码:ide

  1. public class Client {     spa

  2.     //简单折扣计算  orm

  3.     public void calPrice(int price,int discount){  xml

  4.           float knockdownPrice =price * discount / 100.0F;  对象

  5.           System.out.println("折扣后的价格:"+formateCurrency(knockdownPrice));  ci

  6.     }    get

  7.     //复杂多折扣计算(出如今折上折需求上)编译器

  8.    public void calPrice(int price,int... discounts){  

  9.           float knockdownPrice = price;  

  10.           for(int discount:discounts){  

  11.                knockdownPrice = knockdownPrice * discount / 100;  

  12.           }  

  13.             System.out.println("折上折后的价格:"+formateCurrency(knockdownPrice));

  14.    }  

  15.     //格式化成本的货币形式  

  16.     private String formateCurrency(float price){  

  17.            return NumberFormat.getCurrencyInstance().format(price/100);  

  18.     }  

  19.     public static void main(String[] args) {  

  20.           Client client = new Client();  

  21.           //499元的货物,打75折

  22.           client.calPrice(49900, 75);  

  23.     }  

   程序调用了最终调用了非变长参数的方法,由于java在编译时,首先会根据实参的数量和类型来进行处理,并且肯定是否符合方法签名条件,而两个重载方法中,int类型的是一个原生数据类型,而多变参数其实是一个数组对象,编译器偷懒,因而先从简单的方法签名开始,若是符合条件,便可编译经过,因而就出现了这种状况。

下面变长参数方法还有一种状况挺烦人的,看代码:

  1. public class Client {

  2.     public void methodA(String...strs){ }

  3.     public void methodA(Integer...ints){ }

  4.     public static void main(String[] args) {  

  5.           Client client = new Client();  

  6.           //调用方法

  7.           client.methodA(null);    //编译出错

  8.     }  

为何会编译编译出错了,两个方法重载是没问题的,可是在调用时,传入的参数直接使用实参数值,这样java编译器没法判断null属于何种数据对象.不单单调用者须要"猜想"该调用哪一个方法,并且被调用者也可能产生内部逻辑混乱的状况.

这个问题的解决方案有两种:

<1> 调用methodA方法时,设置null一个类型,将变量做为参数传入.

<2> methodA方法不重载,将其中的一个方法名改掉.

相关文章
相关标签/搜索