是否可以为枚举类型实现++
运算符?
我使用枚举类型处理状态机的当前状态,希望能够使用++
运算符。
你不能“递增”枚举类型,但是你可以获取下一个枚举值:
// 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; // 没有“下一个”
return this; // 限制在最后一个实例
return values()[0]; // 循环到第一个
throw new RuntimeException(); // 或者子类,如NoSuchElementException
重写该方法可以避免生成values()
数组并检查其长度的潜在成本。例如,对于最后一个实例没有覆盖它的next()
实现可能是:
public MyEnum next() {
if (ordinal() == values().length - 1)
throw new NoSuchElementException();
return values()[ordinal() + 1];
}
在这里,ordinal()
和values()
都被调用了(通常)两次,这将比上面覆盖的版本执行成本更高。
next
方法中真的需要那个MyEnum
参数吗? - Michael Lang不,Java不支持对任何用户定义的类型(包括枚举)进行自定义运算符重载。
但是,您可以在枚举类中定义一个方法来返回下一个枚举器。
next()
方法来返回下一个枚举值。 - Jim Garrison++
不会改变5
所代表的含义),但++
可以正常工作,因为它改变了你的本地变量“引用”的哪个整数。在枚举类型上使用++
也可以做到同样的事情,通过将本地变量season
从指向SPRING
改为指向SUMMER
来实现。 - amalloy