我在我的应用程序中使用 BigDecimal
来处理 货币 和 百分比。但是,我需要一种区分两者用法的方法(用于呈现它们,例如,在 JTable
中)。因此,我的初始想法是编写两个类,这两个类的行为与 BigDecimal
完全相同,以便我可以对它们进行 instanceof
测试。所以我写了这段代码:
DollarValue.java:
import java.math.BigDecimal;
public class DollarValue extends BigDecimal {
}
PercentValue.java:
import java.math.BigDecimal;
public class PercentValue extends BigDecimal {
}
然而,为了使用构造函数(因为它们不能被继承),您需要手动覆盖每个构造函数。因此,DollarValue.java 变成了一个怪物:
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
public class DollarValue extends BigDecimal {
public DollarValue(char[] in, int offset, int len) {
super(in, offset, len);
}
public DollarValue(char[] in, int offset, int len, MathContext mc) {
super(in, offset, len, mc);
}
public DollarValue(char[] in) {
super(in);
}
public DollarValue(char[] in, MathContext mc) {
super(in, mc);
}
public DollarValue(String val) {
super(val);
}
public DollarValue(String val, MathContext mc) {
super(val, mc);
}
public DollarValue(double val) {
super(val);
}
public DollarValue(double val, MathContext mc) {
super(val, mc);
}
public DollarValue(BigInteger val) {
super(val);
}
public DollarValue(BigInteger val, MathContext mc) {
super(val, mc);
}
public DollarValue(BigInteger unscaledVal, int scale) {
super(unscaledVal, scale);
}
public DollarValue(BigInteger unscaledVal, int scale, MathContext mc) {
super(unscaledVal, scale, mc);
}
public DollarValue(int val) {
super(val);
}
public DollarValue(int val, MathContext mc) {
super(val, mc);
}
public DollarValue(long val) {
super(val);
}
public DollarValue(long val, MathContext mc) {
super(val, mc);
}
}
但更糟糕的是,在实现过程中,这并没有起作用,因为我经常使用静态的BigDecimal
代码。举个例子:
public static void main(String[] args) {
DollarValue dollars = DollarValue.ONE;
DollarValue dollars2 = DollarValue.valueOf(25);
}
会抛出错误,因为DollarValue.ONE
实际上是一个BigDecimal
,而不是DollarValue
,DollarValue#valueOf()
也返回一个BigDecimal
。
所以现在我没有任何主意。有什么最简单的方法可以区分我尝试实现的同一类的两个实现?这似乎是一个简单的问题...
编辑:任何允许我在渲染器中自动区分两者的解决方案也可以。例如,我需要将值提供给JTable
,并且JTable
显示货币符号$
或百分比符号%
。