扩展BigDecimal?

sti*_*vlo 8 java static-methods design-patterns

我使用BigDecimalClass 有相当多的代码,我讨厌界面的笨拙.

通过使用BigDecimal以下方法创建一个带有静态方法的辅助类,我减轻了使用整数s 的痛苦:

compare(BigDecimal first, int second)
divide(BigDecimal dividend, BigDecimal divisor, int scale)
divide(BigDecimal dividend, int divisor, int scale)
divide(int divident, int divisor, int scale)
multiply(BigDecimal first, BigDecimal second, int scale)
multiply(BigDecimal first, int second, int scale)
multiply(int first, int second, int scale)
zeroPad(BigDecimal value, int totalLength, int scale)
Run Code Online (Sandbox Code Playgroud)

这就是我现在所需要的,代码比以前更具可读性.但是,我读到静态方法是一个"坏"的东西,他们不遵循OO原则.

BigDecimal但是,如果我扩展,我会定义一个新类型,因此我必须重新定义所有方法用我的对象包装它们,否则我将无法使用增强方法的结果.做起来似乎并不聪明.

你会如何解决这个问题?

Ton*_*sen 5

我会像你一样完成它!

此类型的所有设计决策都必须基于希望使代码更易于维护,以便下一个程序员接管您之后的代码.这就是为什么我们首先进行面向对象设计和基于组件的开发.

但是考虑到Java的语法,很难为基于数学的表达式创建API.我当前的BigInteger API有两个问题:

  • 它与通常的数学符号并不十分接近
  • 它对于加法和乘法等对称运算符是不对称的

[运算符重载是C++的少数功能之一,我想念Java]

哪个更具可读性?

BigInteger a = ...;
BigInteger b = ...;
BigInteger c = divide(a, b);
Run Code Online (Sandbox Code Playgroud)

要么

BigInteger a = ...;
BigInteger b = ...;
BigInteger c = a.divide(b);
Run Code Online (Sandbox Code Playgroud)

就个人而言,我更喜欢第二个版本.

更糟糕的是不同基类型的数量是同一表达式的一部分的情况.例如

int a = ...;
BigInteger b = ...;
BigInteger c = divide(a, b);
Run Code Online (Sandbox Code Playgroud)

要么

int a = ...;
BigInteger b = ...;
BigInteger c = BigInteger.valueOf(a).divide(b);
Run Code Online (Sandbox Code Playgroud)

还要考虑相应数学符号中小变化的符号的巨大差异:

  • (a-b)*c被翻译成a.subtract(b).multiply(c)multiply(subtract(a,b),c)
  • c*(a-b)被翻译成c.multiply(a.subtract(b))multiply(c,subtract(a,b))

对我来说,编写和读取静态方法表示法比"纯"基于OO的表示法更容易.