当前位置:编程学习 > JAVA >>

编写java代码的几点技巧

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

Java代码

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代码

long i = 200l;//看起来是不是像2001呢;    long i = 200l;//这样,就算有近视,也能辨认清楚了。

 

 

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

例如:

Java代码

if(i > 10000000 && i<100000000) {...}if(j >= 10000000 && j<=100000000) {...} 

可改成:

Java代码

final int begin = 10000000;//或final int begin = 10*1000*1000;final int end = 100000000;//或final int end = 100*1000*1000if (i > begin && i< end){...}if (j >= begin && j<= end){...} 

 

再如timeunit中的代码:

Java代码

// 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代码

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代码

if (profit.compareto(minprofit) < 0 && (profit.compareto(minrateprofit) < 0 || rate.compareto(minrate) < 0)) {            return 0; } else {return 战绩值;} 

 

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

 

 

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

Java代码

if (profit.compareto(minprofit) >= 0 && (profit.compareto(minrateprofit) >= 0 && rate.compareto(minrate) >= 0)) {       return 战绩值;}else {   return 0; } 

 

 

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

 

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

 

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

Java代码

query q = *dao.createquery(hql);       list<?> list = q.list();       if (list != null && list.size() > 0) {          return (dcrace) list.get(0);       } 

 

可以改为:

Java代码

query q = *dao.createquery(hql);       list<?> list = q.list();       if (list.size() > 0) {//删除list != null &&           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等。

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,