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枚举是不是有增量运算符++? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 中没有增量运算符 (++)? [复制]

关于 Java 8(OCA)中的短路运算符和后缀增量的问题 [关闭]

为啥增量运算符不起作用? [复制]

Java 是不是有“IN”运算符或类似 SQL 的函数? [复制]

Java 增量/减量运算符 - 它们的行为方式,功能是啥?

为啥我们在枚举中写 Integer 而不是 int? [复制]