我有一个包含如下代码的类,我希望使用任何代表数字的类/类型都是微不足道的。我发现自己定义了大量方法,如下所示:
public class Range {
private BigDecimal inferior = new BigDecimal(0);
private BigDecimal superior = new BigDecimal(1);
public Range(BigDecimal inferior, BigDecimal superior) {
if (inferior.compareTo(superior) == -1) {
this.inferior = inferior;
this.superior = superior;
}
}
public Range(int inferior, int superior) {
this(new BigDecimal(inferior), new BigDecimal(superior));
}
public Range(Integer inferior, Integer superior) {
this(new BigDecimal(inferior), new BigDecimal(superior));
}
public Range(float inferior, float superior) {
this(new BigDecimal(inferior), new BigDecimal(superior));
}
public Range(double inferior, double superior) {
this(new BigDecimal(inferior), new BigDecimal(superior));
}
}
我什至没有写出所有可能的组合!例如,一个接受一个浮点数和一个 double 数,或者一个整数和一个 BigDecimal。
如何以干净的方式实现这一点,以便存在对已经预定义的多个类/数据类型甚至原语有效的参数?我考虑过适配器和代理,但我经常发现自己不理解这些解释,我无法弄清楚它们是否适合我的用例以及如何 - 这个问题可能已经在 SO 上得到了回答,但至少如果是这样我想看看是否有人可以根据这个特定示例向我解释它。
最佳答案
使用 Builder Pattern .创建一个嵌套的静态类,该类接受两个数字中的每一个的不同数据类型。来自 byte
的原始类型通过 long
将扩大到long
, 和 float
至 double
. BigInteger
s 可以转换为 BigDecimal
s 和 BigDecimal
引用将被复制。
public static class Builder {
BigDecimal first;
BigDecimal second;
public void setFirst(long value) { first = new BigDecimal(value); }
public void setFirst(double value) { first = new BigDecimal(value); }
public void setFirst(BigInteger value) { first = new BigDecimal(value); }
public void setFirst(BigDecimal value) { first = value; }
public void setSecond(long value) { second = new BigDecimal(value); }
public void setSecond(double value) { second = new BigDecimal(value); }
public void setSecond(BigInteger value) { second = new BigDecimal(value); }
public void setSecond(BigDecimal value) { second = value; }
public Range build() {
if (first == null || second == null) {
throw new IllegalArgumentException("Must supply both values.");
}
return new Range(first, second);
}
}
Builder 模式允许在构建所需对象之前进行验证,并且它绕过了尝试覆盖所有可能组合时会发生的“构造函数爆炸”。对于 n 个可能的类型,您有 2 * n 个构建器 setter 方法而不是 n2 个构造函数。
我包括
long
,即使它可以扩大到 double
在法律上,出于精确原因,因为有 very high values of type long
that can't be precisely represented as double
s .然后,您的构造函数变为:
public Range(BigDecimal first, BigDecimal second) {
if (first.compareTo(second) < 0) {
this.inferior = first;
this.superior = second;
}
else {
this.inferior = second;
this.superior = first;
}
}
我换了
== -1
至 < 0
匹配 compareTo
契约(Contract),并添加 else
如果需要,可以切换它们。
关于java - Java 方法中的多个类型参数,包括现有类和原始数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58070970/