当前位置: 首页 > 面试题库 >

您是否应该在Java中始终使用枚举而不是常量

单于帅
2023-03-14
问题内容

在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,但是在.NET中,好的做法是将枚举与使用它们的类并行,即使它仅由一个类使用。也就是说,您将编写:

namespace Whatever
{
    enum MyEnum
    {
    }
    class MyClass
    {
    }
}

因此,您可以使用:

MyClass c = new MyClass(MyEnum.MyValue);


 类似资料:
  • 问题内容: 为什么或者为什么不? 问题答案: 对于性能而言,尤其是在较大范围内进行迭代时,通常会更好。但是,在某些情况下,你可能更喜欢: 在Python 3,range()做什么用做的,不存在。如果要编写可在Python 2和Python 3上运行的代码,则不能使用。 在某些情况下实际上可以更快-例如。如果多次重复相同的序列。 xrange()每次都必须重新构造整数对象,但是range()将拥有真

  • 为什么这是“良好的编码实践”?例如,当我制作一个石头剪刀游戏机时,大多数人建议使用枚举而不是字符串。有什么区别?

  • 问题内容: 无论如何,通过将其与给定的字符串进行比较来检查是否存在枚举?我似乎找不到任何这样的功能。我可以尝试使用该方法并捕获异常,但是据我了解,捕获运行时异常不是一种好习惯。有人有什么想法吗? 问题答案: 我不认为没有捕获异常的内置方法。您可以改用如下方式: 编辑: 正如乔恩·斯凯特(Jon Skeet)所述,每次调用时,都会通过克隆私有支持数组来工作。如果性能至关重要,则可能只需要调用一次,缓

  • 问题内容: Python 3.4引入了一个新模块,该模块向该语言添加了枚举类型。的文档提供了一个示例来演示如何扩展它: 此示例还演示了一个问题:在property方法中,定义了一个常量,该常量通常在类级别定义- 但是尝试在a级别内执行此操作只会将其添加为枚举的成员之一,因此,在方法内部定义。 如果该类想在其他方法中使用此常量,则也必须在其中定义它,这显然不是理想的选择。 有什么方法可以在中定义类常

  • 问题内容: 使用Java 8和lambda,可以很容易地将集合作为流进行迭代,也很容易使用并行流。docs中的两个示例,第二个示例使用parallelStream: 只要我不关心顺序,使用并行会始终有益吗?有人会认为,更快地将工作划分到更多的内核上。 还有其他考虑事项吗?什么时候应该使用并行流,什么时候应该使用非并行? (问这个问题可以引发关于如何以及何时使用并行流的讨论,不是因为我认为始终使用并