将Java Enum用于BigDecimal常量

时间:2016-01-12 19:18:43

标签: java constants bigdecimal

最初我有一个班级有一堆私人静态决赛

private static final BigDecimal BD_0_06 = new BigDecimal("0.06");
private static final BigDecimal BD_0_08 = new BigDecimal("0.08");
private static final BigDecimal BD_0_10 = new BigDecimal("0.10");
private static final BigDecimal BD_0_12 = new BigDecimal("0.12");
private static final BigDecimal BD_0_14 = new BigDecimal("0.14");
    ...

和该类中使用这些常量的一堆方法

private void computeFastenerLengthToleranceMax() {
        if (nominal_fastener_length.compareTo(BigDecimal.ONE) > 0 && nominal_fastener_length.compareTo(BD_TWO_AND_ONE_HALF) <= 0) {
            if (spec.getBasic_major_diameter().compareTo(BD_ONE_QUARTER) >= 0 && spec.getBasic_major_diameter().compareTo(BD_THREE_EIGTHS) <= 0) {
                setLength_tolerance_max(BD_0_02);
            }
            if (spec.getBasic_major_diameter().compareTo(BD_SEVEN_SIXTEENTHS) >= 0 && spec.getBasic_major_diameter().compareTo(BD_ONE_HALF) <= 0) {
                setLength_tolerance_max(BD_0_04);
            }
            if (spec.getBasic_major_diameter().compareTo(BD_NINE_SIXTEENTHS) >= 0 && spec.getBasic_major_diameter().compareTo(BD_THREE_QUARTER) <= 0) {
                setLength_tolerance_max(BD_0_06);
            }

现在我想创建其他使用相同常量的类似类。起初我扩展了一个包含这些常量的基类,但后来由于其他问题决定尝试组合而不是继承,现在我正在尝试将Enum用于我的常量。

public enum EnumBD {
BD_0_00 (new BigDecimal("0.00")),
BD_0_02 (new BigDecimal("0.02")),
BD_0_03 (new BigDecimal("0.03")),
BD_0_04 (new BigDecimal("0.04")),
BD_0_05 (new BigDecimal("0.05")),
    .....
private BigDecimal value;

private EnumBD(BigDecimal value) {
    this.value = value;
}

public BigDecimal getValue() {
    return value;
}

}

但是在我的方法中,我对所有常量的引用都来自于这样的

setLength_tolerance_max(BD_0_02);

到这个

setLength_tolerance_max(EnumBD.BD_0_02.getValue());

我是偏离轨道还是这是如何使用Enum常量?

4 个答案:

答案 0 :(得分:1)

  

现在我想创建其他使用相同类的类   常量。起初我扩展了一个包含这些的基础类   常数然后决定尝试组合而不是继承   由于其他问题,现在我试图使用Enum作为我的   常数。

基本上有两种方法(除了定义自己的枚举类),从广义上讲,导出常量以便在多个类中使用。也就是说,你真的应该考虑是否有一种可行的方法来使用枚举类来表示你的常量,因为只要你有一组在编译时已知的固定常量,就可以使用枚举类。以下是您决定不使用枚举类的情况。

  • 使用界面

此建议随附预订。此机制可用作导出常量的方法,但编码专家将其视为反模式而非模拟,尤其是在您导出的API中。

然而,如果在接口中定义静态最终常量,那么实现该接口(以及该类的任何子类)的任何类都可以通过其非限定名称来使用常量。以这种方式定义ONLY常量的接口称为常量接口。 Java平台库中有一些常量接口的例子。

不使用常量接口的原因很多,并且已在别处讨论过......但是它们可以方便地使用。根据自己的特权使用常量接口,并注意它们有可能导致问题(名称空间污染,程序员混淆等)。

  • 使用课程

在普通类中将常量定义为public,final和static。它们很可能也是原始类型或不可变类型。然后,您的类可以将这些常量导出到可以使用它们的任何其他类。

这比使用常量接口导出常量更受欢迎,因为接口实际上只应用于定义类型和API。不可实例化的&#34;常数类&#34;是一种完全可以接受的类机制。如果常量与主题相关,则尤其如此。例如,假设您希望定义代表不同沸点的常数:

npm start

请注意,构造函数确保该类是不可实例化的。

主要的缺点是你通常必须限定从类名中导出的常量。由于public class BoilingPoints { public static final double WATER = 100.0; : : public static final double ETHANOL = 86.2; private BoilingPoints() { throw new AssertionError(); } } static机制已添加到该语言中,因此,如果您不愿意,请不要这样做。

答案 1 :(得分:1)

当您想要可读性和便利性时,您希望使用常量,例如

static final double PI = 3.1415;

允许你写一些像

这样的东西
c = 2 * PI * r;

明确意图。当您想要确保您的值来自预定义的集合时,在编译时完成检查时,枚举非常有用。假设我想写一个类似交通信号灯的类。我可以为其状态STOPCAUTIONGO定义枚举。这样,我可以确保在编译时,我的光的状态的任何设置将是这三种状态之一。如果我为这些定义了整数常量,那么就没有什么能阻止某人不使用我的常量而只是将状态设置为139.

将值与我的Enum元素相关联的能力是一个额外的便利,例如,在我的交通灯情况下,我可以将RGB值与每个值相关联以用于显示目的。

在你的情况下,似乎相当清楚常量会做,枚举只会使你的代码复杂化。

答案 2 :(得分:0)

似乎enum会让你能够将键值对移动到另一个清理利用这个组合的类的结构。这也可以通过创建一个具有BD_0_00等公共属性的类来实现...... Enum对这个实现并没有太多帮助。

答案 3 :(得分:-1)

在这种情况下不会使用枚举,除非有更多数据在路上描述价值。

一种优先的做事方式是让它们成为全球性的,I.E。 public static final。由于BigDecimal 不可变,您不必担心一般&#34;没有全球状态&#34;规则。它们基本上变成了常数。