编写java代码的几点技巧

(1)bigdecimal中要使用string作为参数来构造(bigdecimal.valueof()会把各种值转化成字符串,再调用 bigdecimal(string)的),否则照样会出问题;

Java代码 复制代码  收藏代码
  1. system.out.println(10000*1.005);        system.out.println(new bigdecimal(10000).multiply(new bigdecimal(1.005)));      system.out.println(bigdecimal.valueof(10000).multiply(bigdecimal.valueof(1.005)));      system.out.println(new bigdecimal("10000").multiply(new bigdecimal("1.005")));  
		system.out.println(10000*1.005);		system.out.println(new bigdecimal(10000).multiply(new bigdecimal(1.005)));		system.out.println(bigdecimal.valueof(10000).multiply(bigdecimal.valueof(1.005)));		system.out.println(new bigdecimal("10000").multiply(new bigdecimal("1.005")));

输出:
10049.999999999998
10049.99999999999893418589635984972119331359863281250000
10050.000
10050.000



(2)长整型要使用大写字母l而不是小写字母l来标识,因为小写字母l看起来有点像数字1;
例如:

Java代码 复制代码  收藏代码
  1. long i = 200l;//看起来是不是像2001呢;    long i = 200l;//这样,就算有近视,也能辨认清楚了。  
    long i = 200l;//看起来是不是像2001呢;    long i = 200l;//这样,就算有近视,也能辨认清楚了。



(3)如果一个类中有多处使用长数字,则可以定义并使用数字常量,到处写长的数字,容易出现多一个0或少一0等写错位数的问题,同时导致问题难以排查。
例如:

Java代码 复制代码  收藏代码
  1. if(i > 10000000 &amp;&amp; i<100000000) {...}if(j >= 10000000 &amp;&amp; j<=100000000) {...}  
if(i > 10000000 &amp;&amp; i<100000000) {...}if(j >= 10000000 &amp;&amp; j<=100000000) {...}

可改成:

Java代码 复制代码  收藏代码
  1. final int begin = 10000000;//或 final int begin = 10*1000*1000;final int end = 100000000;//或 final int end = 100*1000*1000if (i > begin &amp;&amp; i< end){...}if (j >= begin &amp;&amp; j<= end){...}  
final int begin = 10000000;//或 final int begin = 10*1000*1000;final int end = 100000000;//或 final int end = 100*1000*1000if (i > begin &amp;&amp; i< end){...}if (j >= begin &amp;&amp; j<= end){...}


再如timeunit中的代码:

Java代码 复制代码  收藏代码
  1. // handy constants for conversion methods    static final long c0 = 1l;    static final long c1 = c0 * 1000l;    static final long c2 = c1 * 1000l;    static final long c3 = c2 * 1000l;    static final long c4 = c3 * 60l;    static final long c5 = c4 * 60l;    static final long c6 = c5 * 24l;  
    // handy constants for conversion methods    static final long c0 = 1l;    static final long c1 = c0 * 1000l;    static final long c2 = c1 * 1000l;    static final long c3 = c2 * 1000l;    static final long c4 = c3 * 60l;    static final long c5 = c4 * 60l;    static final long c6 = c5 * 24l;




(4)在使用map时,要注意integer与long的自动装箱,要与string类型的key区分开来
例如:

Java代码 复制代码  收藏代码
  1. map<string,string> hm = new hashmap<string,string>();       hm.put("1""1value");      hm.put("2""1value");      hm.put("3""1value");      hm.put("4""1value");              int i = 1;      system.out.println(hm.get(i+1));//错误的做法,值为null      system.out.println(hm.get(string.valueof(i+1)));//正确的做法  
		map<string,string> hm = new hashmap<string,string>();		hm.put("1", "1value");		hm.put("2", "1value");		hm.put("3", "1value");		hm.put("4", "1value");				int i = 1;		system.out.println(hm.get(i+1));//错误的做法,值为null		system.out.println(hm.get(string.valueof(i+1)));//正确的做法


输出:
null
1value
因为i+1计算后自动装箱成integer(2),而hm.get(new integer(2)) 与hm.get(new string(2))是完全不一样的。


(5)有同学写代码,把数字转型为字串时喜欢用类似 i+"" 这种方式,个人认为这样的代码比较难看,可以写成 string.valueof(i),它是不是好看一些。


(6)对于复杂的判断条件,最好不要经常使用“非”等排除条件式子,这样不便于理解组合条件的含义:
例如:
   如果 成功方案赢利≥1000元 或 成功方案赢利≥500元且回报率≥10倍 则返回战绩,否则 返回0;

不便于直接思维的、排除式的写法:

Java代码 复制代码  收藏代码
  1. if (profit.compareto(minprofit) < 0 &amp;&amp; (profit.compareto(minrateprofit) < 0 || rate.compareto(minrate) < 0)) {            return 0; } else {return 战绩值;}  
 if (profit.compareto(minprofit) < 0 &amp;&amp; (profit.compareto(minrateprofit) < 0 || rate.compareto(minrate) < 0)) {            return 0; } else {return 战绩值;}


这个是正确的写法,但是因为整合条件都要反过来写,类似:a&amp;&amp;b 变成 !a||!b,很难理解,也极容易把(!a || !b)写成 (!a &amp;&amp; !b)。


便于理解的、直观式的写法:

Java代码 复制代码  收藏代码
  1. if (profit.compareto(minprofit) >= 0 &amp;&amp; (profit.compareto(minrateprofit) >= 0 &amp;&amp; rate.compareto(minrate) >= 0)) {       return 战绩值;}else {   return 0; }  
 if (profit.compareto(minprofit) >= 0 &amp;&amp; (profit.compareto(minrateprofit) >= 0 &amp;&amp; rate.compareto(minrate) >= 0)) {       return 战绩值;}else {   return 0; }



(7)经常看见list!=null &amp;&amp; list.size()>0 这样的代码,大概担心用到的list为null而导致空指针异常,其实list!=null一般是没有必要,这样的代码比较难看一点。

《effective java》建议:对返回值为collection或map的子类的,尽量返回一个元素为空的collection或map,而不是返回null。

事实上,很多开源的框架中就是这么做的,看下面应用hibernate的一段代码:

Java代码 复制代码  收藏代码
  1. query q = *dao.createquery(hql);       list<?> list = q.list();       if (list != null &amp;&amp; list.size() > 0) {          return (dcrace) list.get(0);       }  
        query q = *dao.createquery(hql);       list<?> list = q.list();       if (list != null &amp;&amp; list.size() > 0) {          return (dcrace) list.get(0);       }


可以改为:

Java代码 复制代码  收藏代码
  1. query q = *dao.createquery(hql);       list<?> list = q.list();       if (list.size() > 0) {//删除 list != null &amp;&amp;           return (dcrace) list.get(0);       }  
        query q = *dao.createquery(hql);       list<?> list = q.list();       if (list.size() > 0) {//删除 list != null &amp;&amp;           return (dcrace) list.get(0);       }


事实上,q.list()永远不会返回null,所以没有必要判断list是否为null,这样代码更加简洁、好看。

(8)bigdecimal是一个只读类,它的对象一旦构建好了,就无法修改该该对象的属性。如:
public bigdecimal setscale(int newscale, int roundingmode)
public bigdecimal add(bigdecimal augend)
等方法都是返回一个新的bigdecimal对象,而对原来的bigdecimal不会起热任何修改作用的。jdk中类似的只读类还有:所有的基本数据类型,所有的数据封装类,biginteger,string等。

 

转自:http://haouziwefe.iteye.com/blog/1147281

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值