您的位置:首页 > 编程语言 > Java开发

编写java代码的几点技巧

2011-11-16 16:44 337 查看
(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")));

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;//这样,就算有近视,也能辨认清楚了。

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

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

例如:

Java代码

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

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){...}

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;

// 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)));//正确的做法

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 战绩值;}

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; }

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); }

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); }

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等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: