為了提供公司的財務信息化,公司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也拉近了和掃地僧的距離,從掃地僧身上學到了很多沒有掌握的東西。