接口与枚举

时间:2010-03-27 07:46:58

标签: java enums

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

5 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:5)

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

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

enum Rank { 
    ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, 
    EIGHT, NINE, TEN, JACK, QUEEN, KING; 
}
enum Suit { SPADES, CLUBS, DIAMONDS, HEARTS } 

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

但是,有时候,您只是对在某处声明了一堆经常使用的值感兴趣。在这种情况下,将它们放在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;

至于接口:永远不要将常量放在接口中。 “常量接口”模式很糟糕(justification),并且由于import static被添加到Java,因此使用它的唯一参数无效。

答案 2 :(得分:2)

接口用于定义常见行为,用于定义公共值的枚举。

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

答案 3 :(得分:0)

如果你使用Java 5或更新版本,那么Enum就是你要走的路。唯一的例外是如果你的const列表是开放的并且可以扩展。枚举不能扩展。另一个例外是它是单个值,如MAX_INTEGER。

答案 4 :(得分:0)

只需一个代码:

public interface InterfaceForConstants() {
    String **TOTO** = "Et voilà !";
    double **PI** = 3.14159265358979323846;
}

使用:

class ClasseName implements InterfaceForConstants () {

    String myString;

    if (myString.equals(**TOTO**) {
        // do something
    }

    double circumference = **PI** * diameter; // instead of MathConstants.PI * diameter;

}

干净简单。如果某件事可以满足您的需求,请选择最简单的一项! 即使不遵守规则,按规则编写代码也不错,而编写易于阅读的代码则更好。考虑一下几个月后何时必须阅读代码。 如果您想更具体一点,请编写一个Javadoc进行解释!