接口与枚举

abs*_*son 20 java enums

在接口和枚举之间,哪个更适合声明常量?为什么会这样?

bra*_*boy 13

使用Enums来声明常量总是更好,因为接口的目标是完全不同的.是的,有很多接口都有public static final常量,但我觉得enums独有的工作就是为你提供这些常量.

  • `public static final`常量来自`enum`之前的时间.:) (6认同)
  • 是的,当然,因为上次我检查过`Math`不是一个界面. (6认同)
  • @Bombe,这不完全正确.如果,比如今天要重写`java.lang.Math`,`PI`和`E`仍将被声明为`public static final double`常量. (5认同)

twk*_*twk 5

接口旨在定义通用行为,枚举用于定义通用值。

枚举代​​表一个真实值,可以与另一个值进行比较,或轻松存储在数据库中。您还可以有一个标志枚举(在 C# 中,在 Java 中不知道),它允许您对枚举的值执行二进制运算(AND、OR、XOR 等)。


gus*_*afc 5

如果你的常量有一个特定类型的原因,如果它们需要某种行为(即方法),或者它们是其他值的组合,那么enums是要走的路.

例如,假设您正在实施纸牌游戏,并且您想要代表价值观和套装:

enum Rank { 
    ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, 
    EIGHT, NINE, TEN, JACK, QUEEN, KING; 
}
enum Suit { SPADES, CLUBS, DIAMONDS, HEARTS } 
Run Code Online (Sandbox Code Playgroud)

在那里,现在不可能制作带有伪装或等级的卡片.

但有时候,您只是对在某处声明了一堆经常使用的值感兴趣.在这种情况下,将它们放入一个enum只是不必要的努力,因为这些常量只是一个工具,可以让我们在计算圆周长或其他东西时记住π的所有小数.哪个看起来更好?

// Using enum:
enum MathConstant { 
    PI(3.14159265358979323846), E(2.7182818284590452354);
    private final double value;
    MathConstant(double v) { value = v; }
    public double value() { return value; } 
}
// Usage:
double circumference = MathConstant.PI.value() * diameter;

// Using a constant class:
final class MathConstants { 
    private MathConstants() { throw new UnsupportedOperationException(); }
    public static final double PI = 3.14159265358979323846,
                               E = 2.7182818284590452354;
}
// Usage:
double circumference = MathConstants.PI * diameter;
Run Code Online (Sandbox Code Playgroud)

至于接口:永远不要将常量放在接口中."常量接口"模式很糟糕(理由),并且使用它的唯一参数自import static添加到Java 以来已被赋予无效.

  • 嗯,有点像。反对使用常量接口的主要原因是,“实现”接口可以轻松舒适地避免导入常量。也有语义上的理由反对它;接口是一组可以实现的行为,而不是一包常量。现在,类在语义上也不是真正正确的放置常量的位置,但它们可以是最终的且不可实例化的,这使得它们的行为更像子命名空间而不是类(这正是我们想要的)。 (2认同)