为了避免幻数,我总是在代码中使用常量。回到过去,我们习惯在无方法接口中定义常量集,现在它已成为反模式。
我想知道最佳做法是什么?我在谈论全局常量。枚举是在Java中存储常量的最佳选择吗?
答案 0 :(得分:30)
对于幻数,其中数字实际具有含义并且不仅仅是标签,您显然不应该使用枚举。那么旧的风格仍然是最好的。
public static final int PAGE_SIZE = 300;
如果您只是标记某些内容,则会使用枚举。
enum Drink_Size
{
TALL,
GRANDE,
VENTI;
}
有时将所有全局常量放在自己的类中是有意义的,但我更喜欢将它们放在与它们关系最紧密的类中。这并不总是很容易确定,但在一天结束时,最重要的是你的代码有效:)
答案 1 :(得分:4)
是的。 Enum是最好的选择。
你是免费的:
一体化。
但是等等,还有更多。每个枚举值都可以有自己的字段和方法。它是一个丰富的常量对象,具有允许转换为不同形式的行为。不仅仅是为了弦,而是为了你需要的任何目标。
答案 2 :(得分:2)
Enum最适合大多数情况,但不是一切。有些可能会像以前一样更好,也就是在一个带有公共静态常量的特殊类中。
枚举不是最佳解决方案的例子是数学常数,如PI。为此创建枚举会使代码变得更糟。
enum MathConstants {
PI(3.14);
double a;
MathConstants(double a) {
this.a = a;
}
double getValueA() {
return a;
}
}
用法:
MathConstants.PI.getValueA();
丑陋不是吗?比较:
MathConstants.PI;
答案 3 :(得分:1)
使用接口存储常量是一种滥用的接口。
但使用Enums并不是每种情况的最佳方式。通常普通的int
或其他任何常数就足够了。定义自己的类实例(“类型安全的枚举”)更加灵活,例如:
public abstract class MyConst {
public static final MyConst FOO = new MyConst("foo") {
public void doSomething() {
...
}
};
public static final MyConst BAR = new MyConst("bar") {
public void doSomething() {
...
}
};
protected abstract void doSomething();
private final String id;
private MyConst(String id) {
this.id = id;
}
public String toString() {
return id;
}
...
}
答案 4 :(得分:0)
忘记枚举 - 现在,当Java中的静态导入可用时,将所有常量放在REAL类(而不是接口)中,然后使用import static <Package or Class>
从所有其他常量导入静态成员。