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

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

滕祯
2023-03-14
问题内容

假设我有一个枚举:

enum E {
    A, B, C;
}

正如所示这个答案由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 static enum A { 
    X, Y, Z;
    private static A[] vals = values();
    public A next()
    {
        return vals[(this.ordinal()+1) % vals.length];
    }

的实现previous()留给练习,但是请记住,在Java中,模a % b可以返回负数。

编辑:根据建议,制作values()数组的私有静态副本,以避免每次复制数组next()previous()调用数组。



 类似资料:
  • 在我的表中,我希望有指向MyEnumCode表的字段。 使用currenlty同时支持EnumType.Ordinal和EnumType.String,我想这不是一个好主意。 还有一个问题。如何使用Java类数据填写表?你会怎么做?最好的方法。 这里当然有弊端。但目前我看不出更好的方法。请不要提供EnumType.Ordinal和EnumType.String的备选项。我不想在这里写它的用法可能存

  • 具有以下定义 是否有一种方法可以正确执行比较以使用标准等式:

  • 问题内容: 我读了《有效Java》,其中指出最好使用来实现单例。 此方法在功能上等效于公共领域方法,除了它更简洁,免费提供序列化机制,甚至针对复杂的序列化或反射攻击,还提供了针对多重实例化的明确保证。尽管此方法尚未得到广泛采用,但是单元素枚举类型是实现单例的最佳方法。 尽管如此,这似乎是在动态序列化和真正的单实例上实现的折衷方案,但您却失去了经典单例的更友好的OOP方法。枚举不能被继承,只能实现一

  • 问题内容: 在SO问题上编写的内容基础上构建Java最佳单例实现 -即关于使用枚举创建单例-之间的区别/优点/缺点(省略构造函数) and then calling 和 and then calling 问题答案: 假设您要绑定到将使用给定对象的属性的对象-您可以非常轻松地传递Elvis.INSTANCE,但是您不能传递Elvis.class并期望它找到该属性(除非经过故意编码才能找到类的静态属性

  • 问题内容: 我正在阅读有关sqlalchemy的信息,并且看到了以下代码: 我应该在库中使用常量将“类型”设置为int吗?还是我应该使枚举成为枚举? 问题答案: SQLAlchemy从0.6开始具有Enum类型:http ://docs.sqlalchemy.org/en/latest/core/type_basics.html?highlight=enum#sqlalchemy.types.En

  • 问题内容: 我在这里看到了一些有关处理和持久保存枚举式值的最佳方法的问题/讨论(例如,持久化适用于枚举的数据,如何使用NHibernate来持久化枚举),我想问一下一般共识是什么。 特别是: 这些值应如何在代码中处理? 应该如何将它们持久保存到数据库中(作为文本/作为数字)? 不同解决方案的权衡是什么? 注意:我已将本问题中最初包含的解释移至答案。 问题答案: 我试图总结我的理解。 如果有任何更正