关于通用方法和准则
不要在常量和变量中出现易混淆的字母
包名全小写,类名首字母全大写,常量全部大写并用下划线分隔,变量采用驼峰命名法(Camel Case)命名等,这些都是最基本的Java编码规范,是每个Javaer都应熟知的规则,但是在变量的声明中要注意不要引入容易混淆的字母。
【问题代码】
public class Client {
public static void main(String[]args){
long i=1l;
System.out.println("i的两倍是:"+(i+i));
}
}
此处运行结果为2,而不是22。
【建议】
- 字母“l”(还包括大写字母“O”)尽量不要和数字混用
- 如果字母和数字必须混合使用,字母“l”务必大写,字母“O”则增加注释
- 字母“l”作为长整型标志时务必大写
避免带有变长参数的方法重载
在项目和系统的开发中,为了提高方法的灵活度和可复用性,我们经常要传递不确定数量的参数到方法中,因此,Java 5引入变长参数(varags)就是为了更好地提高方法的复用性,让方法的调用者可以“随心所欲”地传递实参数量。
变长参数也是要遵循一定规则的,比如变长参数必须是方法中的最后一个参数;一个方法不能定义多个变长参数等
【问题代码】
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);
}
}
【问题分析】
多折扣计算方法看似重载了简单折扣计算方法,实则覆盖了后者的参数范畴。
此处运行结果为:简单折扣后的价格是:374.25。
【建议】
尽管此处编译器根据实参类型和个数(int,int)来默认匹配了第一个callPrice方法,但是为了让我们的代码能够被人类所看懂,还是要慎重考虑变长参数的方法的重载问题。
别让null和空值影响到变长方法
还是变长参数的方法重载问题。
【问题代码】
public class Client {
public void fun(String str, Integer......is) {
}
public void fun(String str, String......strs) {
}
public static void main(String[] args) {
Client client = new Client();
client.fun("ABC");
client.fun("ABC", null);
}
}
【问题分析】
上面代码根本编译不过(方法模糊不清,编译器不知道调用哪一个方法)。
该代码违反了懒人原则。第二个实参null没有类型,两个fun方法都符合调用请求,因此编译器不知道该调用哪个方法。
【建议】
- 按照懒人原则编写代码。
- 不要隐藏实参类型,这非常危险,不仅仅调用者需要“猜测”该调用哪个方法,而且被调用者也可能产生内部逻辑混乱的情况。
【修改】
public static void main(String[] args) {
Client client = new Client();
String[] strs = null;
client.fun("ABC", null);
}
让编译器知道这个null值是String类型的,编译即可顺利通过。