今天做項目遇到兩個很有意思的問題,有三個int類型的計數(shù)器,通過一大坨ifelse來分類對計數(shù)器進(jìn)行累加。
由于這坨ifelse太大了,所以我把它extract了一下,refactor到了一個新的PRivate方法中,把計數(shù)器傳到該方法里進(jìn)行更新。然而在方法快要完成的時候突然意識到,java傳遞基本類型只是傳值,方法內(nèi)部改變不了外部的計數(shù)器的值。差點(diǎn)挖了坑,因此創(chuàng)建了一個包裝類:
private class IntWrapper{ public int value; public IntWrapper(int value) { this.value = value; }}然后傳遞給private方法 IntWrapper
對象,在方法內(nèi)部可以對外部包裝對象計數(shù)器進(jìn)行累加:
這樣就可以更新外部計數(shù)器的值了。
和C中傳遞指針有些相似。
然后我又抽取了另外的一大坨ifelse生成一個新的方法,需要給該方法傳遞一個BigDecimal類型的對象,然后方法內(nèi)部對該對象進(jìn)行累加更新:
private methodAfterRefactor(BigDecimal amount){ if(xxx){ amount = amount.add(new BigDecimal(567));//1 }}剛開始沒發(fā)現(xiàn)不對勁,可是仔細(xì)思考了一下,發(fā)現(xiàn)坑了:
java語言中所有參數(shù)都是按值傳遞的,注釋1處的add方法返回了一個新的 BigDecimal
對象,將新對象的地址賦值給方法局部引用變量amount,這一系列操作完全沒有影響到外部 BigDecimal
對象。沒有改變它的域值,也沒有改變它指向的對象(引用變量值)。
思索了一下,我又創(chuàng)建了一個 BigDecimal
的包裹類:
然后抽取出來的方法變成了這樣:
private methodAfterRefactor(BigDecimalWrapper wrapper){ if(xxx){ wrapper.value = wrapper.value.add(new BigDecimal(567));//1 }}這樣就能成功地修改到方法外部引用的值了。
這是不是指針的指針有些相似呢…
新聞熱點(diǎn)
疑難解答
圖片精選