Java枚举是否有增量运算符++?

Tom*_*Boo 21 java enums increment operators

是否可以++为枚举实现运算符?

我使用枚举处理状态机的当前状态,能够使用++运算符会很好.

Boh*_*ian 47

你不能"增加"枚举,但你可以得到下一个枚举:

// MyEnum e;
MyEnum next = MyEnum.values()[e.ordinal() + 1];
Run Code Online (Sandbox Code Playgroud)

但更好的方法是在枚举上创建一个实例方法.

请注意如何为最后一个enum实例处理有问题的下一个值,因为没有"next"实例:

public enum MyEnum {

    Alpha,
    Bravo,
    Charlie {
        @Override
        public MyEnum next() {
            return null; // see below for options for this line
        };
    };

    public MyEnum next() {
        // No bounds checking required here, because the last instance overrides
        return values()[ordinal() + 1];
    }
}
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

// MyEnum e;
e = e.next();
Run Code Online (Sandbox Code Playgroud)

您对实施重叠next()方法的合理选择包括:

  • return null; // there is no "next"
  • return this; // capped at the last instance
  • return values()[0]; // rollover to the first
  • throw new RuntimeException(); // or a subclass like NoSuchElementException

覆盖该方法避免了生成values()阵列以检查其长度的潜在成本.例如,next()最后一个实例覆盖它的实现可能是:

public MyEnum next() {
    if (ordinal() == values().length - 1)
        throw new NoSuchElementException();
    return values()[ordinal() + 1];
}
Run Code Online (Sandbox Code Playgroud)

在这里,无论是ordinal()values()(通常)称为两次,这将花费更多的不是上面的重写版本执行.

  • 您实际上并不需要“next”方法中的“MyEnum”参数,对吗? (2认同)
  • @MichaelLang 该死的-我从静态方法开始,然后将其更改为实例方法,但将参数保留在:( 谢谢。 (2认同)
  • 覆盖最后一个枚举是一个很酷的主意,可以避免条件,并且每次调用只调用一次values()。会记住那个模式。我知道过早优化的负面影响。但对于可能以我意想不到的方式使用的公共枚举,添加单个字段声明对我来说似乎是值得的。 (2认同)
  • @彼得是-感谢让我知道。实际上,代码需要的修复不仅仅是我已经完成的修复。 (2认同)