首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >区分货币BigDecimal和百分比BigDecimal

区分货币BigDecimal和百分比BigDecimal
EN

Stack Overflow用户
提问于 2014-05-10 23:26:14
回答 2查看 618关注 0票数 3

在我的整个应用程序中,我都使用BigDecimal来处理、money、 handle 。但是,我需要一种方法来区分这两种用法(为了呈现它们,即在JTable中)。因此,我最初的想法是编写两个行为完全类似于BigDecimal的类,这样我就可以对它们进行instanceof测试。所以我写了这段代码:

DollarValue.java:

代码语言:javascript
复制
import java.math.BigDecimal;

public class DollarValue extends BigDecimal {

}

PercentValue.java:

代码语言:javascript
复制
import java.math.BigDecimal;

public class PercentValue extends BigDecimal {

}

但是,为了使用构造函数(因为它们不能被继承),我需要手动覆盖每个构造函数。因此,DollarValue.java变成了一个怪物:

代码语言:javascript
复制
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代码。为了说明:

代码语言:javascript
复制
public static void main(String[] args) {
    DollarValue dollars = DollarValue.ONE;
    DollarValue dollars2 = DollarValue.valueOf(25);
}

抛出一个错误,因为DollarValue.ONE实际上是一个BigDecimal,而不是一个DollarValueDollarValue#valueOf()也返回一个BigDecimal

所以现在我没有主意了。在我试图实现的方法中,区分同一个类的两个实现的最简单方法是什么?这似乎是个简单的问题..。

编辑:任何解决方案,允许我自动区分两者在一个渲染器也将工作。例如,我需要将值提供给一个JTable,并让JTable显示一个美元符号$表示货币,或者一个百分比签名%表示百分比。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-11 16:14:48

我强烈建议使用尤达-钱库来使用金钱,而不是试图自己重新发明轮子。用钱工作是一个常见且棘手的问题。让别人帮你解决吧。

在您的项目中添加一个新的依赖项总是有点令人沮丧,但是当涉及到提供明显但难以实现的好处的核心实用程序库时,它应该是一个无需考虑的问题。其他一些重要的图书馆是:

  • 番石榴 --这绝对应该是任何现代Java代码库的一部分。提供的公用设施和新藏品具有不可替代的价值。
  • 尤达-时间 (除非您在Java 8上)--比如money,时间是一个非常复杂的数据结构,需要正确地表示(正如Java的长期中断的日历和相关类所证明的那样),Joda-Time提供了一个健壮且深思熟虑的接口。

还有很多其他的库,我可以说是值得使用的,但是如果您不使用这三个库,您确实犯了一个错误。虽然技术上“非标准”(如您所注意到的)是如此普遍,但它们在概念上并不是Java开发人员工具箱的一部分。

票数 1
EN

Stack Overflow用户

发布于 2014-05-10 23:52:44

使用组合,而不是继承。在BigDecimal中执行所有算法,但是有两个类,每个类都有一个接受BigDecimal参数的构造函数和一个返回BigDecimal的getValue方法。

代码看起来要复杂一些:

代码语言:javascript
复制
DollarValue dollars = new DollarValue(BigDecimal.ONE);
DollarValue dollars2 = new DollarValue(BigDecimal.valueOf(25));
DollarValue sum = new DollarValue(dollars.getValue().add(dollars2.getValue()));

如果其中一个类有几个真正常见的操作,则直接在该类中实现该操作。例如,DollarValue可以有:

代码语言:javascript
复制
public DollarValue sum(DollarValue other) {
  return new DollarValue(getValue().add(other.getValue()));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23587378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档