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