【问题标题】:Is it right way to place applications constant as shown in my code example?如我的代码示例所示,将应用程序保持不变是正确的方法吗?
【发布时间】:2013-02-22 16:13:27
【问题描述】:
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 旨在成为一个我将存储所有值的地方,这些值不应该是“幻数”。比如windows坐标等。我计划可以有一些字段如DAYS_IN_WEEK = 7, MAX_smth = ..., ... , ... .

【问题讨论】:

  • 对于真正的 value-constant 就像你的一样,这有点矫枉过正。对 enumerated 类型使用枚举,例如状态或其他类型。
  • Enums 提供了更多有用的方法... Enum javadoc - docs.oracle.com/javase/6/docs/api/java/lang/Enum.html
  • 恕我直言,我更喜欢使用enum 方法。如果您要选择类解决方案,至少将其设为final(没有类可以继承它)并将构造函数设为private(无需创建类的实例)。

标签: java enums constants


【解决方案1】:

使用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);
}

【讨论】:

  • 在这种情况下,我怀疑 AppConst 将成为不相关类型的 const 变量的“接收器”,所以我想知道是否有任何方法可以获取 AppConst 作为参数......但是当然,如果不了解整个上下文就很难说...
  • @phtrivier 确实,没有上下文,很难判断所选方式的一致性。
【解决方案2】:

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

公共枚举性别 MALE("男", "男", "先生"), FEMALE("女性", "女人", "女士");

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

  ....

}

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

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

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

【讨论】:

    【解决方案3】:

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

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

    1. 如果您确实打算在未来将其用于其他附加 与尺寸无关的常数,我会 绝对选择静态选项。
    2. 如果您打算仅将它用于这两个常量,我 然后将使用与 AppConst 不同的名称,这给出了这个想法 我们谈论的是尺寸。

    【讨论】:

      【解决方案4】:

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

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

      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 只是常量,您可以将它们存储为常量字段。

      【讨论】:

        【解决方案5】:

        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 上添加新常量很容易,您可以在不破坏现有代码的情况下添加新常量。

        【讨论】:

          最近更新 更多