改善Java程序的建议(每日5条)1

目录
  • 建议一:不要再常量和变量中出现容易混淆的字母
  • 建议二: 不要让常量蜕变成变量
  • 建议三: 三元操作符的类型务必一致
  • 建议四: 避免带有变长参数的方法重载
  • 建议五: 别让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类型的,编译即可顺利通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值