是否可以++
为枚举实现运算符?
我用枚举处理状态机的当前状态,如果能够使用++
操作符会很好。
你不能“增加”一个枚举,但你可以得到下一个枚举:
// 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()
(通常)都被调用了两次,这将比上面的覆盖版本花费更多的执行成本。
否。Java 不支持任何用户定义类型(包括枚举)的自定义运算符重载。
但是,您可以在返回下一个枚举数的枚举类中定义一个方法。