2013-03-17 12 views
3

考慮下面的代碼:爲什麼不可變類提供增變器?

bdval = new BigDecimal(strval, new MathContext(attrib.getPrecision())); 
    bdval.setScale(attrib.getScale(), RoundingMode.HALF_UP); 

PMD完全正確說:

不可變

浪費動作,因而,爲什麼不可變類,如BigDecimal出口增變了性質?

回答

8

setScale()不改變它被調用的BigDecimal。它會返回BigDecimal的副本和新的比例值。

由於您的代碼錯誤,PMD會報告錯誤:它會忽略使操作無效的操作結果。您的代碼應該是:

bdval = bdval.setScale(attrib.getScale(), RoundingMode.HALF_UP); 
+0

話,我會說這是設計不良api.It應該是靜態方法,它違反了單一職責原則。 – Inquisitive 2013-03-17 14:53:42

+5

如果'setScale'是靜態的,那麼代碼會更加冗長'BigDecimal.setScale(bdval,attrib.getScale(),RoundingMode.HALF_UP);'沒有真正的好處 - 邏輯仍然存在於BigDecimal類中。有一個很好的理由可以使BigDecimals的操作邏輯屬於BigDecimal類。 – 2013-03-17 15:03:43

+3

當然,_naming_可以使用改進 - 我可能使用'withScale'而不是'setScale'。但我認爲該方法的位置很好。 – 2013-03-17 17:00:40

相關問題