java - 在 Java 中你应该总是使用枚举而不是常量吗?

标签 java coding-style enums

在 java <1.5 中,常量会这样实现

public class MyClass {
    public static int VERTICAL = 0;
    public static int HORIZONTAL = 1;

    private int orientation;

    public MyClass(int orientation) {
        this.orientation = orientation;
    }
...

你会像这样使用它:

MyClass myClass = new MyClass(MyClass.VERTICAL);

现在,在 1.5 中显然你应该使用枚举:

public class MyClass {
    public static enum Orientation {
        VERTICAL, HORIZONTAL;
    }

    private Orientation orientation;

    public MyClass(Orientation orientation) {
        this.orientation = orientation;
    }
...

现在你可以像这样使用它:

MyClass myClass = new MyClass(MyClass.Orientation.VERTICAL);

我觉得有点难看。现在我可以轻松地添加几个静态变量:

public class MyClass {
    public static Orientation VERTICAL = Orientation.VERTICAL;
    public static Orientation HORIZONTAL = Orientation.HORIZONTAL;

    public static enum Orientation {
        VERTICAL, HORIZONTAL;
    }

    private Orientation orientation;

    public MyClass(Orientation orientation) {
        this.orientation = orientation;
    }
...

现在我可以再次这样做:

MyClass myClass = new MyClass(MyClass.VERTICAL);

具有枚举的所有类型安全优点。

这是好的风格,坏的风格还是两者都不是。你能想到更好的解决方案吗?

更新

Vilx- 是第一个强调我所缺少的东西的人 - 枚举应该是一等公民。在 Java 中,这意味着它在包中有自己的文件——我们没有命名空间。原以为会有点重量级,但真正做了之后,感觉绝对是对的。

Yuval 的回答很好,但它并没有真正强调非嵌套枚举。此外,对于 1.4 - JDK 中有很多地方使用整数,我真的在寻找一种方法来改进这种代码。

最佳答案

你把它复杂化了。让我们把它们放在一起。

Java 1.5 之后你应该使用 Java Enum 类:

public enum Color
{
    BLACK, WHITE;
}

Java 1.5 之前你应该使用类型安全的 Enum 模式:

public class Color
{
    public static Color WHITE = new Color("white");
    public static Color BLACK = new Color("black");

    private String color;

    private Color(String s)
    {
        color = s;
    }
}

在这两种方式中,您都可以这样调用它:

drawBackground(Color.WHITE);

具体来说,关于你的问题。这是代码风格的问题,但我认为首选方法是将枚举保留在它们单独的类中。特别是一旦他们开始获得自己的方法,如 getName()getId() 等...将其视为与常规类与匿名类相同的困境,一旦类(class)开始变得困惑,就该将其移出到自己的文件中了。

关于java - 在 Java 中你应该总是使用枚举而不是常量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/367104/

相关文章:

java - 为什么不能在 switch 语句中完全限定枚举值?

Java if 语句作业

javascript - 发送图像套接字io和android

c++ - 如何在不使用 'using' 的情况下缩短 C++ 头文件中的 namespace 缩进?

coding-style - 我可以在 Haskell 中避免 "rightward drift"吗?

java - 这种 Java 异常风格是不好的做法吗?

enums - 如何使用 Dart/Flutter 将枚举属性序列化/反序列化到 Firestore?

java - Maven:如何检查哪些 jar 根本没有被使用

java - 如何使用 Jackson 将 POJO 转换为 XML

swift - 如何将 Int 转换为枚举?