java代码编写出现的陷阱-1:警惕变长参数
2014-03-13 13:18
316 查看
在Java5 中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定的参数,对于同一方法可以使用不同个数的参数调用,调用的时候可以给出任意多个参数也可不给参数.
如method(Object...objs){...} . 调用时的代码是:method("str") 或者method(null),method("张三","李四","王五").
但是如果出现下面的情况,可就麻烦了,不多说,看代码:
public class Client {
//简单折扣计算
public void calPrice(int price,int discount){
float knockdownPrice =price * discount / 100.0F;
System.out.println("折扣后的价格:"+formateCurrency(knockdownPrice));
}
//复杂多折扣计算(出现在折上折需求上)
public void calPrice(int price,int... discounts){
float knockdownPrice = price;
for(int discount:discounts){
knockdownPrice = knockdownPrice * discount / 100;
}
System.out.println("折上折后的价格:"+formateCurrency(knockdownPrice));
}
//格式化成本的货币形式
private String formateCurrency(float price){
return NumberFormat.getCurrencyInstance().format(price/100);
}
public static void main(String[] args) {
Client client = new Client();
//499元的货物,打75折
client.calPrice(49900, 75);
}
程序调用了最终调用了非变长参数的方法,因为java在编译时,首先会根据实参的数量和类型来进行处理,而且确定是否符合方法签名条件,而两个重载方法中,int类型的是一个原生数据类型,而多变参数实际上是一个数组对象,编译器偷懒,于是先从简单的方法签名开始,如果符合条件,即可编译通过,于是就出现了这种情况。
下面变长参数方法还有一种情况挺烦人的,看代码:
public class Client {
public void methodA(String...strs){ }
public void methodA(Integer...ints){ }
public static void main(String[] args) {
Client client = new Client();
//调用方法
client.methodA(null); //编译出错
}
为什么会编译编译出错了,两个方法重载是没问题的,但是在调用时,传入的参数直接使用实参数值,这样java编译器无法判断null属于何种数据对象.不仅仅调用者需要"猜测"该调用哪个方法,而且被调用者也可能产生内部逻辑混乱的情况.
这个问题的解决方案有两种:
<1> 调用methodA方法时,设置null一个类型,将变量作为参数传入.
<2> methodA方法不重载,将其中的一个方法名改掉.
如method(Object...objs){...} . 调用时的代码是:method("str") 或者method(null),method("张三","李四","王五").
但是如果出现下面的情况,可就麻烦了,不多说,看代码:
public class Client {
//简单折扣计算
public void calPrice(int price,int discount){
float knockdownPrice =price * discount / 100.0F;
System.out.println("折扣后的价格:"+formateCurrency(knockdownPrice));
}
//复杂多折扣计算(出现在折上折需求上)
public void calPrice(int price,int... discounts){
float knockdownPrice = price;
for(int discount:discounts){
knockdownPrice = knockdownPrice * discount / 100;
}
System.out.println("折上折后的价格:"+formateCurrency(knockdownPrice));
}
//格式化成本的货币形式
private String formateCurrency(float price){
return NumberFormat.getCurrencyInstance().format(price/100);
}
public static void main(String[] args) {
Client client = new Client();
//499元的货物,打75折
client.calPrice(49900, 75);
}
程序调用了最终调用了非变长参数的方法,因为java在编译时,首先会根据实参的数量和类型来进行处理,而且确定是否符合方法签名条件,而两个重载方法中,int类型的是一个原生数据类型,而多变参数实际上是一个数组对象,编译器偷懒,于是先从简单的方法签名开始,如果符合条件,即可编译通过,于是就出现了这种情况。
下面变长参数方法还有一种情况挺烦人的,看代码:
public class Client {
public void methodA(String...strs){ }
public void methodA(Integer...ints){ }
public static void main(String[] args) {
Client client = new Client();
//调用方法
client.methodA(null); //编译出错
}
为什么会编译编译出错了,两个方法重载是没问题的,但是在调用时,传入的参数直接使用实参数值,这样java编译器无法判断null属于何种数据对象.不仅仅调用者需要"猜测"该调用哪个方法,而且被调用者也可能产生内部逻辑混乱的情况.
这个问题的解决方案有两种:
<1> 调用methodA方法时,设置null一个类型,将变量作为参数传入.
<2> methodA方法不重载,将其中的一个方法名改掉.
相关文章推荐
- java代码编写出现的陷阱-2:阴沟里翻船
- [编写高质量代码:改善java程序的151个建议]建议53 注意方法中传递的参数要求
- [编写高质量代码:改善java程序的151个建议]建议62 警惕数组的浅拷贝
- [编写高质量代码:改善java程序的151个建议]建议53 注意方法中传递的参数要求
- [编写高质量代码:改善java程序的151个建议]建议62 警惕数组的浅拷贝
- [改善Java代码]警惕自增的陷阱
- jmeter 使用BeanShell编写java代码提取请求参数
- [编写高质量代码:改善java程序的151个建议]建议65 避开基本类型数组转换列表陷阱
- 【Java编写代码所以到的陷阱】
- 用Notpad++编写JAVA代码在控制台运行出现乱码问题的解决
- Java编写代码所以到的陷阱
- Java代码编写的30条建议
- 类访问及java代码编写的限制
- 编写高质量代码:改善Java程序的151个建议
- Java中编写可变长参数的函数
- Java代码编写的30条建议
- [编写高质量代码:改善java程序的151个建议]equals相关
- [编写高质量代码:改善java程序的151个建议]建议69 列表相等只需关心元素相等
- Unity3D研究院之打开Activity与调用JAVA代码传递参数