涉及幻数的全局常量的最佳实践

时间:2010-10-14 08:22:12

标签: java coding-style constants

为了避免幻数,我总是在代码中使用常量。回到过去,我们习惯在无方法接口中定义常量集,现在它已成为反模式。

我想知道最佳做法是什么?我在谈论全局常量。枚举是在Java中存储常量的最佳选择吗?

5 个答案:

答案 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>从所有其他常量导入静态成员。