在我的整个应用程序中,我都使用BigDecimal来处理、money、和 handle 。但是,我需要一种方法来区分这两种用法(为了呈现它们,即在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显示一个美元符号$表示货币,或者一个百分比签名%表示百分比。
发布于 2014-05-11 16:14:48
我强烈建议使用尤达-钱库来使用金钱,而不是试图自己重新发明轮子。用钱工作是一个常见且棘手的问题。让别人帮你解决吧。
在您的项目中添加一个新的依赖项总是有点令人沮丧,但是当涉及到提供明显但难以实现的好处的核心实用程序库时,它应该是一个无需考虑的问题。其他一些重要的图书馆是:
还有很多其他的库,我可以说是值得使用的,但是如果您不使用这三个库,您确实犯了一个错误。虽然技术上“非标准”(如您所注意到的)是如此普遍,但它们在概念上并不是Java开发人员工具箱的一部分。
发布于 2014-05-10 23:52:44
使用组合,而不是继承。在BigDecimal中执行所有算法,但是有两个类,每个类都有一个接受BigDecimal参数的构造函数和一个返回BigDecimal的getValue方法。
代码看起来要复杂一些:
DollarValue dollars = new DollarValue(BigDecimal.ONE);
DollarValue dollars2 = new DollarValue(BigDecimal.valueOf(25));
DollarValue sum = new DollarValue(dollars.getValue().add(dollars2.getValue()));如果其中一个类有几个真正常见的操作,则直接在该类中实现该操作。例如,DollarValue可以有:
public DollarValue sum(DollarValue other) {
return new DollarValue(getValue().add(other.getValue()));
}https://stackoverflow.com/questions/23587378
复制相似问题