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

时间:2013-07-15 21:40:42

标签: java enums operators increment

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

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

2 个答案:

答案 0 :(得分:43)

你无法“增加”枚举,但你可以获得 next 枚举:

// MyEnum e;
MyEnum next = MyEnum.values()[e.ordinal() + 1];

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

请注意如何为最后一个枚举实例处理有问题的下一个值,其中没有“下一个”实例:

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];
    }
}

所以你可以这样做:

// MyEnum e;
e = e.next();

您对实施重叠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];
}

此处,ordinal()values()(通常)都称为两次,执行成本比上面覆盖的版本要多。

答案 1 :(得分:4)

没有。 Java不支持任何用户定义类型的自定义运算符重载,包括枚举。

但是,您可以在枚举类中定义一个返回下一个枚举器的方法。