1
public enum AppConst{
    WIDTH (1280),
    HEIGHT (800);

    private final int value;

    AppConst(int value) {
        this.value = value;
    }
    private int get() { return value; }
}

VS。

public class AppConst{
    public static final int WIDTH = 1280;
    public static final int HEIGHT = 800;
}

我读到它enums更适合用于存储常量值。像我展示的那样存储它们是一种好方法还是我误解了什么?

编辑。我认为将所有这些值放在一个地方可能会更好,因为如果需要,我们可以轻松地修改它们。我错了吗?

编辑2。 AppConst 旨在成为一个我将存储所有值的地方,这些值不应该是“幻数”。例如windows坐标等。我计划可能有一些字段,例如DAYS_IN_WEEK = 7, MAX_smth = ..., ... , ...。

4

5 回答 5

3

使用Enums代替static final变量的主要好处是在处理出于安全需要的方法参数的限制时。这是一个例子:

public void myMethod(int width, int height){}

VS

public void myMethod(AppConst width, AppConst height){}

第二个限制可接受的int值,在您的情况下:800 和 1280。

因此,根据您的需要,枚举可以比静态常量更安全。

此外,由于您没有将行为带入枚举,因此您可以简短地编写:

public enum AppConst{
    WIDTH (1280),
    HEIGHT (800);
}
于 2013-02-22T16:20:48.100 回答
2

枚举旨在表示枚举类型;也就是说,一种仅由一组有限的已知值组成的数据。如果要添加多个“位”信息,则向枚举添加数据很有趣:

公共枚举性别 MALE(“男性”,“男性”,“先生”),女性(“女性”,“女性”,“女士”);

  private String genderName;
  private String genderPerson;
  private String genderTitle;

  ....

}

通常,有一个变量代表一个对象,并打开它的值。

我认为在你的情况下,你只是想要两个众所周知的整数值,所以我会选择静态最终 int。

请注意,正如@PremGenEditor 所指出的,您可能会遇到 WIDTH 和 HEIGHT 发生变化的情况,因此它们最终可能只是某个对象的另一个属性;他们自然会是一个整数。

于 2013-02-22T16:21:30.690 回答
2

通常枚举用于包含相同类型实体的一组值。虽然这可能仍然适合您的情况,只有 WIDTH 和 HEIGHT,但如果您需要为背景颜色添加新的应用程序常量,则不再适用。

AppConst 类的名称让我想到了一些通用的东西。我在这里看到两个案例:

  1. 如果您将来确实打算将其用于其他与维度无关的附加常量,我肯定会选择静态选项。
  2. 如果您打算仅将它用于这两个常量,那么我将使用与 AppConst 不同的名称,这给出了我们正在谈论维度的想法。
于 2013-02-22T16:24:11.060 回答
1

对于真正的价值- 常数就像你的一样,这有点矫枉过正。将枚举用于枚举类型,例如状态或其他内容。

过去,你可能做过这样的事情:

public static final int STATUS_OKAY = 0;
public static final int STATUS_ERROR = 1;
public static final int STATUS_WARNING = 3;

public static final int SOMETHINGELSE = 0;

// ...

if (getStatus() == STATUS_OKAY){
    // Do something...
}
if (getStatus() == 4) // This is NEVER true! Still it's allowed

但这不是类型保存。您还可以将它与一个甚至不存在的值进行比较(比如说4)。使用枚举,您没有它,并且您的代码更具可读性:

public enum Status{
    OKAY, WARNING, ERROR
}

if (getStatus() == Status.OKAY){
    // Do Something
}
if (getStatus() == Status.DOESNTEXIST) // Compile-time error.

意图变得更加清晰,您获得了更好的代码,并且您对枚举的-constants具有编译时安全性。


在您的示例中,WIDTH并且HEIGHT只是常量值,您可以将它们存储为常量字段。

于 2013-02-22T16:23:12.133 回答
0

Java 中的枚举是类型安全的,并且有自己的命名空间。这意味着您的枚举将在下面的示例中具有例如“AppConst”的类型,并且您不能分配除枚举常量中指定的任何值。

public enum AppConst { WIDTH (1280), HEIGHT (800);}
AppConst height = AppConst.HEIGHT;
height = 1; /*compilation error*/

Java 中的 Enum 是类或接口等引用类型,您可以在 java Enum 中定义构造函数、方法和变量,这使其比 C 和 C++ 语言中的 Enum 更强大。

Java 中的枚举可以用作 switch 语句的参数,并且可以使用“case:”,如 int 或 char 原始类型。java enum 的这一特性使它们对开关操作非常有用。

由于 Java 中 Enum 中定义的常量是最终的,因此您可以使用“==”等式运算符安全地比较它们,如下所示:

AppConst height = AppConst.HEIGHT;
if (height == AppConst.HEIGHT){
  System.out.println("Hello World!");
}

但不推荐使用 == 运算符比较对象,始终使用 equals() 方法或 compareTo() 方法来比较对象。

Java 中的 Enum 可以像普通类一样实现接口并覆盖任何方法。另外值得注意的是,Java 中的 Enum 隐式实现了 Serializable 和 Comparable 接口。

您可以在 Java 中的 Enum 内部定义抽象方法,也可以为 Java 中的不同枚举实例提供不同的实现。

枚举有自己的命名空间。在 Java 中的 Enum 上添加新常量很容易,您可以在不破坏现有代码的情况下添加新常量。

于 2013-02-22T17:10:47.100 回答