@RequiredArgsConstructor
public abstract class Amount {
protected final BigDecimal value;
// very lite "factory" pattern
public static Amount of(String value) {
if (value.contains(",")) {
return new AmountWithComma(value);
//ps: find better names here
}
return new AmountWithoutComma(value);
}
public BigDecimal value() {
return value;
}
public abstract String display();
}
现在,派生类--你可以把它们作为内部类(或者只是打包保护类),并对项目的其余部分“隐藏”它们:
static class AmountWithComma extends Amount {
AmountWithComma(String value) {
super(new BigDecimal(value.replaceAll(",", "")));
}
@Override
public String display() {
return value.setScale(2).toString();
}
}
static class AmountWithoutComma extends Amount {
private final DecimalFormat decimalFormat = new DecimalFormat("#,##0.00");
AmountWithoutComma(String value) {
super(new BigDecimal(value));
}
@Override
public String display() {
return decimalFormat.format(value.doubleValue());
}
}
1条答案
按热度按时间eanckbw91#
您可以使用多态性来实现:你可以有一个 Amount 基类,然后有两个派生类来显示带或不带逗号的值。这是一个非常基本的例子,你可以把它做得更好,找到更好的名字:
现在,派生类--你可以把它们作为内部类(或者只是打包保护类),并对项目的其余部分“隐藏”它们:
现在,你可以像这样使用它:
此外,您始终可以使用
amount.value()
访问器以 BigDecimal 的形式获取值,因此您可以潜在地传递此对象而不是传递String并始终解析或格式化它。