Java 从BigDecimal.setScale 函数的 过期提醒,看编码封装思路 (源码简读)

前言

好久好久好久,没写文章了。今天就分享点好玩但我觉得也有意义的东西吧。

 

正文

有没有人注意到 这个保留小数位的函数 setScale ,在使用JDK java11的时候,标记上了过期提醒:

public BigDecimal setScale(int newScale, int roundingMode)

点进去一看,其实是从9开始就标记了 :
 

然后瞧瞧作者提供了一个新的函数,其实就是往外面套了一层:
 

 

从这个改动,大家能想到些什么 ?

作者改了入参。 从本身传入int 改成了 使用枚举代替  :

个人啰嗦的分析 :

首先,不管从 原来的函数的入参 或是新函数的入参命名来看,

RoundingMode :舍入模式

也就是说, 这个函数是针对舍入做的处理, 那么显然,支持的模式是  无限制的么?

那肯定不可能啊。

所以你看看原来那个过期的函数 ,在代码最前面,写个了什么if判断 ?

作者是说,这个支持的模式只有 0到7 啊, 你别乱传,传了得拦截你的。

那么这样是个好的封装么?  大家自己思考。

然后我们看看 新的函数的改动:

① 保证了原先的逻辑一样, 替换函数的人不需要对比逻辑是否有变动

② 换成了 自己定义的 舍入枚举 来代替 int 入参 

看看,如果按照新的函数,只能传入 这枚举里面的属性,也就是 对舍入模式做了限制,只有0-7,

就不会出现违规被拦截的模式:

而且从枚举的命名上,也是可以更直接看出来,每个模式的简要作用 (当然我英文一般,也是查了才知道):

 

UP 只要非零就进1
DOWN 只要非零就舍弃
CEILING 数值大于零,则入1;数值小于零,则舍去
FLOOR 数值小于零,则入1;数值大于零,则舍去
HALF_UP 四舍五入
HALF_DOWN 只有大于五才会入1,等于五也舍
HALF_EVEN 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。如果被舍弃部分 > 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同RoundingMode.DOWN
UNNECESSARY 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP;如果为偶数,则舍入行为同RoundingMode.HALF_DOWN。注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。此舍入模式也称为“银行家舍入法”,主要在美国使用。此舍入模式类似于 Java 中对float 和double 算法使用的舍入策略。
 

HALF_EVEN:

UNNECESSARY:

好了,就讲这些吧。

猜你喜欢

转载自blog.csdn.net/qq_35387940/article/details/135084486
今日推荐