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

2022-09-01 15:13:06

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

我用枚举处理状态机的当前状态,如果能够使用运算符就好了。++


答案 1

你不能“递增”一个枚举,但你可以得到下一个枚举:

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

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

请注意如何处理最后一个枚举实例的有问题的 next 值,该实例没有“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];
    }
}

所以你可以这样做:

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

对于 overidden 方法的实现,您拥有的合理选择包括: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()


答案 2

不。Java 不支持对任何用户定义类型(包括枚举)进行定制运算符重载。

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