编写java代码的几点技巧

系统 1565 0

(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

编写java代码的几点技巧


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论