目录
- 建议一:不要再常量和变量中出现容易混淆的字母
- 建议二: 不要让常量蜕变成变量
- 建议三: 三元操作符的类型务必一致
- 建议四: 避免带有变长参数的方法重载
- 建议五: 别让null值与空值威胁到变长方法
建议一:不要再常量和变量中出现容易混淆的字母
- 包名全小写、类名首字母全大写,常量全部大写并用下划线分割,变量采用驼峰命名法等,这些都是最基本的Java编码规范。
但是 在java中注意不要引入容易混淆的字母。尝试阅读以下代码
public class Test{
public static void main(Stringp[] args){
long i = 1l;
System.out.print("i的两倍是:"+(i+i));
}
}
可能有的观看不自习的人看到肯定会说运行结果是22但是最终结果是2.
因为赋值给变量i的数字就是"1",只是后面加了长整型变量的标识字母"l"而已
所以尽量避免混用。
如果字母和数字必须混合使用时,"字母l"务必要大写,字母"O”要增加注释
建议二: 不要让常量蜕变成变量
不要以为final static修饰的常量就一定不会变,不能二次复制
public class Test{
public static void main(String[] args){
System.out.println("常量会变:"+Const.RAND_CONST);
}
}
interface Const{
// 这样还是常量嘛?
public static final int RAND_CONST = new Random().nextInt();
}
RAND_CONT是常量吗?它的值会变!这种常量的定义方式绝对不可取,常量就是常量在编译器就确定了值,不应该在运行期更改,否则程序可读性非常差,甚至连写这个代码的人都不能确定在运行期到底发生了什么。
建议三: 三元操作符的类型务必一致
- 三元操作符是if-else的间歇方式,使用的地方很多,也非常好用
public class Test{
public static void main(String[] args){
int i = 80;
String s = String.valueOf(i<100?90:100);
String s1 = String.valueOf(i<100?90:100.0);
System.out.print("两者是否相等:"+s.equals(s1));
}
}
分析一下这段程序 : i是80,那它的值当然小于100,两者的返回值肯定都是90,再转成String类型,其值也绝对相等。恩分析的很有道理,但是变量s中三元操作符的第二个操作数是100。s1中的是100.0难道没有影响吗?
但是运行结果确实false
问题就在100与100.0上
s的理解正常
s1的却不同,100.0是个浮点数 也就是三元运算符的两个操作数类型不同,可它必须要返回以一个数据,而且类型不确定,不可能条件为真时返回int,假时返回 浮点类型,编译器是不允许的,所以他会类型转换int转换为90.0,那他当然与整形的90不相等了
三元运算符的转换规则
- 若两个操作数不可转换,则不做转换
- 若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int类型转换为long类型,long转换为float类型
- 若两个操作数中一个是数字S,另一个是表达式,且其类型标识为T,说数字S在T范围内,则转换为T类型;若S超出了T范围,则T转换为S类型
- 若干两个操作数都是直接量数字,则返回值类型为范围较大者
注意所以我们要保证三元运算符两个操作数类型一致
建议四: 避免带有变长参数的方法重载
在项目中我们经常要传递不确定数量的参数到方法中,在JDK5之前就是把形参定义成Collection类型或其子类型,或者数组类型,缺点就是需要对空参数进行判断和筛选。JDK5引入了变长参数就是为了更好的提高复用性,让方法随心所欲的调用,当然也是要遵循一定规则的
- 变长参数必须是方法中最后一个参数
- 一个方法不能定义多个变长参数
public class Test{
public void calPrice(int price,int discount){
System.out.print("简单折扣后的价格是");
}
public void calPrice(int price,int...discounts){
System.out.print("复杂折扣后的价格是");
}
}
这两个方法是重载,但是仔细瞧瞧就是第二个参数不一样,那么调用时会先调用哪个方法?
Java编译器很聪敏,会根据方法签名确定调用哪个方法譬如calPrice(100,10)
会调用第一个方法,为什么呐,因为int是一个原生数据类型,数组本身就是一个对象,编译器想要偷懒,于是就从最简单的开始猜想。
建议五: 别让null值与空值威胁到变长方法
public class Test{
public void methodA(String str,Integer ...is){
}
public void methodA(String str,String...strs){
}
public static void main(String[] args){
Test ts = new Test();
ts.methodA("china",0);
ts.methodA("China","People");
ts.methodA("china");
ts.methodA("china",null);
}
}
两个methodA都进行了重载,现在的问题是:上面的代码编译通不过,问题出在那里。就是这两句ts.methodA(“china”); ts.methodA(“china”,null);,两个方法都符合形参格式,编译器不知道调用哪个方法。于是报错。主要是这个方法的设计者违反了Kiss原则。所以应该这样修改
public class Test{
public void methodA(String str,Integer ...is){
}
public void methodA(String str,String...strs){
}
public static void main(String[] args){
Test ts = new Test();
String[] strs = null;
ts.methodA("china",strs);
}
}
让编译器知道这个null值是String类型的,编译即可顺利通过。