接口和枚举之间,哪个更适合声明常量?为什么这样?接口与枚举
接口与枚举
回答
它总是更好地使用枚举来声明常量,因为接口的目标是完全不同的级别。是的,有很多接口有一个public static final
常量,但我觉得枚举独占工作是为您提供这些常量。
接口旨在定义常见行为,枚举以定义常见值。
枚举表示一个实际值,可以将其与另一个值进行比较,或者轻松存储在数据库中。 你也可以有一个flag-enum(在C#中,不知道在Java中),它允许你对enum的值(AND,OR,XOR等)执行二进制运算。
在Java中,枚举基本上是(常量)类,因此您可以使用它们比使用.NET 4.0之前的c#中的枚举更多。 我认为C#/ .net 4.0将实现此功能。 – Tedil 2010-03-27 08:42:47
@Tedil:C#4.0功能集已完成。它不包括增强的面向对象枚举。 – missingfaktor 2010-03-27 12:02:04
如果你的常量有一个特定类型的原因,如果他们需要某种行为(即方法),或者它们是其他值的组合,那么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,所以使用它的唯一参数已被呈现为无效。
如果你使用Java 5或更新的版本,那么Enum就是要走的路。唯一的例外是如果你的const列表打开并且可以被扩展。枚举不能被扩展。另一个例外是它是单个值,比如MAX_INTEGER。
- 1. 使用接口与枚举
- 2. 枚举的接口
- 3. 泛型和接口枚举
- 4. pyserial枚举端口
- 5. 如何枚举网络接口
- 6. 结构体,枚举,类,接口,其他?
- 7. Java - 类,接口或枚举预期
- 8. 通用接口扩展通用枚举
- 9. 添加接口到groovy枚举?
- 10. 什么是类,枚举,接口,属性?
- 11. Java泛型:枚举和接口
- 12. 使用枚举的EnumSet实现接口
- 13. 通用接口扩展通用枚举
- 14. 错误:类,接口,或枚举预期
- 15. 在接口/基类中的C#枚举?
- 16. 类,接口或枚举预计
- 17. 访问接口内的枚举
- 18. 使用枚举作为类型/接口
- 19. 错误类接口或枚举预计
- 20. 通过aidl接口传递枚举
- 21. 错误:类,接口,或枚举编译
- 22. 枚举接口和向量类
- 23. 可以枚举类型的接口
- 24. Java泛型枚举子类型接口
- 25. Jackson:序列化枚举为接口
- 26. 与枚举
- 27. C++与枚举
- 28. Html.HiddenFor与枚举
- 29. RangeAttribute与枚举
- 30. 与枚举
“公共静态final”常量来自'enum'之前的时间。 :) – Bombe 2010-03-27 08:30:32
@Bombe,这不完全正确。如果今天要重写'java.lang.Math',那么'PI'和'E'仍然会被声明为'public static final double'常量。 – gustafc 2010-03-27 09:04:56
是的,当然,因为上次我检查'Math'不是一个接口。 – Bombe 2010-03-27 11:52:04