如我的代码示例所示,将应用程序设置为常量是否正确?

时间:2013-02-22 16:13:27

标签: java enums constants

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最好用于存储常量值。它是一种很好的方式来存储它们,因为我展示或我误解了什么?

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

EDIT2 AppConst旨在成为一个地方,我将存储所有值,这不应该是“魔术数字”。比如窗口坐标等我计划可能有一些字段为DAYS_IN_WEEK = 7,MAX_smth = ...,...,....

5 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

枚举用于表示枚举类型;也就是说,一种简单地由有限的已知值组成的数据类型。如果想要添加多个“位”信息,那么将数据添加到枚举是很有趣的:

public enum Gender       男性(“男性”,“男性”,“先生”),       女性(“女性”,“女性”,“女士”);

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

  ....

}

通常,有一个变量代表一个对象,并切换其值。

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

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

答案 2 :(得分:2)

通常,枚举用于包含同一类实体的值集。虽然在你的情况下这可能仍然只适用于WIDTH和HEIGHT,但如果你需要为背景颜色添加一个新的应用程序常量,它将不再适用。

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

  1. 如果您实际上计划将来再使用此功能 与尺寸无关的常数,我愿意 绝对选择静态选项。
  2. 如果你打算只将这个用于这两个常数,我 然后会使用与AppConst不同的名称,它提供了这个想法 我们正在谈论维度。

答案 3 :(得分:1)

对于真正的 -constant就像你的一样,这有点矫枉过正。使用枚举 -types的枚举,例如状态或其他内容。

当天回来,你可能会做这样的事情:

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具有编译时安全性。


在您的示例中,WIDTHHEIGHT只是常量,您可以将它们存储为常量字段。

答案 4 :(得分:0)

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

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

Java中的枚举是类或接口的引用类型,您可以在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中的枚举可以实现接口并覆盖任何方法,如普通类。值得注意的是,java中的Enum隐式实现了Serializable和Comparable接口。

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

Enum有自己的名字空间。在Java中使用Enum添加新常量非常简单,您可以在不破坏现有代码的情况下添加新常量。