接口和枚举之间,哪个更适合声明常量?为什么这样?接口与枚举
接口与枚举
回答
它总是更好地使用枚举来声明常量,因为接口的目标是完全不同的级别。是的,有很多接口有一个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. 枚举V5接口设计
- 3. pyserial枚举端口
- 4. 添加接口到groovy枚举?
- 5. 错误:类,接口,或枚举编译
- 6. Java泛型枚举子类型接口
- 7. Java - 类,接口或枚举预期
- 8. 结构体,枚举,类,接口,其他?
- 9. 在接口/基类中的C#枚举?
- 10. Jackson:序列化枚举为接口
- 11. 通过aidl接口传递枚举
- 12. 类,接口或枚举预计
- 13. 与枚举
- 14. C++与枚举
- 15. 与protobuf的枚举替换C++枚举
- 16. 如何将VB.net接口与枚举转换为C#
- 17. 在c#接口实现枚举和接口的方法签名
- 18. LINQ和枚举与左连接
- 19. 接受多个枚举与迅速
- 20. scanf()与C++枚举
- 21. 反射与枚举
- 22. 带枚举的MySQL枚举
- 23. Java枚举找到枚举
- 24. Java类枚举枚举类
- 25. 在枚举中枚举
- 26. 转换枚举来枚举
- 27. 重新枚举枚举
- 28. 枚举Open JDBC连接?
- 29. 接通作用域枚举
- 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