Java枚举是不是有增量运算符++? [复制]
Posted
技术标签:
【中文标题】Java枚举是不是有增量运算符++? [复制]【英文标题】:Is there an increment operator ++ for Java enum? [duplicate]Java枚举是否有增量运算符++? [复制] 【发布时间】:2013-07-13 22:04:37 【问题描述】:是否可以为枚举实现++
运算符?
我使用枚举处理 state machine 的当前状态,如果能够使用 ++
运算符,那就太好了。
【问题讨论】:
如果你在谈论运算符重载,不,这不能用 Java 完成 请参阅this answer。请注意,++ 不能与枚举直接对应,因为枚举常量是不可变的。您能做的最好的事情就是定义一个返回下一个枚举值的next()
方法。
这是一个误导性的比较:整数常量也是不可变的(因为 ++
不会改变 5
的含义),但 ++
工作正常,因为它改变了 which 整数您的本地“指代”。枚举上的++
可以做同样的事情,方法是将本地season
更改为指向SUMMER
而不是SPRING
。
【参考方案1】:
你不能“增加”一个枚举,但是你可以获得下一个枚举:
// 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()
都(通常)被称为两次,这将比上面覆盖的版本花费更多的执行成本。
【讨论】:
你真的不需要next
方法中的MyEnum
参数,对吗?
@MichaelLang 该死的 - 我开始使用静态方法,然后将其更改为实例方法,但将参数留在:( Thx.
Jim Garrison 的回答(参见上面的链接)只调用 values() 一次——每次调用都会复制数组。此外,它使用模运算符处理枚举结束后的递增。
@AndyThomas 我有一个脑电波。请参阅非副本的编辑答案,但对 values()
实现的单一调用,这也是恕我直言,良好的 OO 代码示例。
@peter 是的 - 感谢您告诉我。实际上,代码需要更多的修复,而不仅仅是我已经到位的。【参考方案2】:
没有。 Java 不支持任何用户定义类型的自定义运算符重载,包括枚举。
但是,您可以在枚举类中定义一个返回下一个枚举数的方法。
【讨论】:
以上是关于Java枚举是不是有增量运算符++? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
关于 Java 8(OCA)中的短路运算符和后缀增量的问题 [关闭]