2010-03-27 124 views

回答

12

它总是更好地使用枚举来声明常量,因为接口的目标是完全不同的级别。是的,有很多接口有一个public static final常量,但我觉得枚举独占工作是为您提供这些常量。

+6

“公共静态final”常量来自'enum'之前的时间。 :) – Bombe 2010-03-27 08:30:32

+5

@Bombe,这不完全正确。如果今天要重写'java.lang.Math',那么'PI'和'E'仍然会被声明为'public static final double'常量。 – gustafc 2010-03-27 09:04:56

+6

是的,当然,因为上次我检查'Math'不是一个接口。 – Bombe 2010-03-27 11:52:04

2

接口旨在定义常见行为,枚举以定义常见值。

枚举表示一个实际值,可以将其与另一个值进行比较,或者轻松存储在数据库中。 你也可以有一个flag-enum(在C#中,不知道在Java中),它允许你对enum的值(AND,OR,XOR等)执行二进制运算。

+1

在Java中,枚举基本上是(常量)类,因此您可以使用它们比使用.NET 4.0之前的c#中的枚举更多。 我认为C#/ .net 4.0将实现此功能。 – Tedil 2010-03-27 08:42:47

+0

@Tedil:C#4.0功能集已完成。它不包括增强的面向对象枚举。 – missingfaktor 2010-03-27 12:02:04

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,所以使用它的唯一参数已被呈现为无效。

0

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