java - 在枚举类型上实现 `next` 和 `previous` 的最佳方法是什么?

标签 java optimization enums

假设我有一个枚举:

enum E {
    A, B, C;
}

this answer所示由 lucasmo , 枚举值按照初始化的顺序存储在一个静态数组中,稍后您可以使用 E.values() 检索(克隆)该数组。

现在假设我想实现 E#getNextE#getPrevious 以使以下所有表达式的计算结果为 true:

E.A.getNext() == E.B
E.B.getNext() == E.C
E.C.getNext() == E.A

E.A.getPrevious() == E.C
E.B.getPrevious() == E.A
E.C.getPrevious() == E.B

我目前对 getNext 的实现如下:

public E getNext() {
    E[] e = E.values();
    int i = 0;
    for (; e[i] != this; i++)
        ;
    i++;
    i %= e.length;
    return e[i];
}

getPrevious 的类似方法。

然而,这段代码充其量似乎很麻烦(例如,“空” for 循环、有争议的计数器变量滥用,最坏的情况可能是错误的(可能是思考反射)。

在 Java 7 中为枚举类型实现 getNextgetPrevious 方法的最佳方法是什么?


注意:我确实希望这个问题是主观的。我对“最佳”实现的要求是要求最快、最干净和最可维护的实现的简写。

最佳答案

试试这个:

public enum A {
    X, Y, Z;
    
    private static final A[] vals = values();
    
    public A next() {
        return vals[(this.ordinal() + 1) % vals.length];
    }
}

previous() 的实现留作练习,但请记住 in Java, the modulo a % b can return a negative number .

编辑:按照建议,制作 values() 数组的私有(private)静态副本,以避免每次 next()previous()< 时都复制数组 被调用。

关于java - 在枚举类型上实现 `next` 和 `previous` 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17006239/

相关文章:

c - 当我有每个 CPU 的数据结构时,将它们放在不同的页面上是否会提高性能?

c++ - C++ 中的一个成员枚举

scala - 自定义 Scala 枚举,搜索到的最优雅的版本

java - @JsonValue 在枚举字段上,当此枚举用作映射键时

java - Eclipse 从 CMD 提示符找到 Java,但不能从桌面单击找到 Java

java.lang.NoClassDefFoundError : org/jboss/netty/channel/ChannelFactory 错误

java - 使用 editText 进行搜索功能 - ListView

java - 使用 Java 的 Selenium Webdriver : Exception in thread "main" org. openqa.selenium.ElementNotVisibleException:

java - 考虑到内存限制,是否有另一种方法可以在 Java 中处理大型二维数组?

image - 无情地压缩网络大图像