为了提供公司的财务信息化,公司A上线了一套自主研发的财务系统,上班第一天,财务C姐就发现了情况不对:几项支出都对,但支出总和一直为0,赶紧向大老板报告。大老板勃然大怒,责令技术部门今天必须解决,小B负责了这个模块出现了问题,被技术总监大骂一通,泽明中午吃饭前必须解决,否则不用吃饭了,可以直接滚蛋了!
小B慌了,失业的话,下个月的房租就没有着落了,感觉拉出这段代码进行调试:
public static void main(String[] args) { BigDecimal cost1=new BigDecimal("1024"); BigDecimal cost2=new BigDecimal("2048"); BigDecimal cost3=new BigDecimal("3072"); BigDecimal cost4=new BigDecimal("4096"); BigDecimal total=BigDecimal.ZERO; total.add(cost1); total.add(cost2); total.add(cost3); total.add(cost4); System.out.println(total); }
打印结果为:0
是不是没创建总额对象的问题?赶紧改改:
public static void main(String[] args) { BigDecimal cost1=new BigDecimal("1024"); BigDecimal cost2=new BigDecimal("2048"); BigDecimal cost3=new BigDecimal("3072"); BigDecimal cost4=new BigDecimal("4096"); BigDecimal total=new BigDecimal("0"); total.add(cost1); total.add(cost2); total.add(cost3); total.add(cost4); System.out.println(total); }
结果仍然为:0
考虑到下个月要不要流落街头的问题,小B赶紧向公司的技术大神扫地僧请教,在一个月零食伺候的诱惑下,扫地僧放下手头的<代码大全2>,扫了一眼代码,动了动手指。
扫地僧:"好了,你运行一下吧!"。于是又拿起了<代码大全2>看了起来。
小B 赶紧运行了一下,计算结果正确了,他瞅了瞅代码,代码没怎么变样呀?
public static void main(String[] args) { BigDecimal cost1=new BigDecimal("1024"); BigDecimal cost2=new BigDecimal("2048"); BigDecimal cost3=new BigDecimal("3072"); BigDecimal cost4=new BigDecimal("4096"); BigDecimal total=BigDecimal.ZERO; total=total.add(cost1); total=total.add(cost2); total=total.add(cost3); total=total.add(cost4); System.out.println(total); }
小B暗想:“一个月的零食呀,太了黑。可是我的程序和扫地僧一样呀,为什么他的程序能得出正确的结果?而我的就是0呢?不行,我得问出缘由,不能白白浪费了一次请教的机会!”
于是小B虚心向扫地僧请教,扫地僧看在一个月零食的面子上,停下来给菜鸟小B讲解。
扫地僧:“记不记的我给你讲过,String是不可变的?”
小B:“记得,记得,您老讲过,字符String的类是final修饰的,不可改变,字符的拼接是产生新的字符而不是改变原来的值。”
扫地僧:“孺子可教也,其实如BigDecimal,BigInteger,Integer,Long,Short,Byte,Character,Boolean,Float和Double的实例也是不可变的。我们不能修改现有实例的值,对这些类型的操作将返回新的实例”。
小B:“那为什么它这样设计呢?不是很容易让大家犯错了吗?”
扫地僧:“起先,不可变类型看起来可能很不自然,但
是它们具有很多胜过与其向对应的可变类型的优势。不可变类型更容易设计、实
现和使用;它们出错的可能性更小,并且更加安全。”
小B:“您老真厉害!”
扫地僧:“你还年轻,悟性也好,慢慢加油吧!”
这次事件起的突然,解决的也比较顺利,财务系统也运行良好了。小B的职位也保住了,为了答谢扫地僧,小B也包圆了扫地僧一个月的零食,借此机会,小B也拉近了和扫地僧的距离,从扫地僧身上学到了很多没有掌握的东西。