Java中枚举值之间的切换

Java中枚举值之间的切换,java,enums,Java,Enums,如果这是一个愚蠢的问题,请原谅,但我想知道Java中的枚举是否与整数类似。我的意思是,假设我有一个enum声明为 public enum Colour { BLACK, WHITE } 我能像在INT之间切换那样在它们之间切换吗?像 Colour newColour = !newColour; 因为据我所知,它们基本上都是C中的INT。它有什么相似之处吗?当然,您可以通过在枚举中定义toggle方法来实现相同的行为: enum Colour { BLACK, WHITE;

如果这是一个愚蠢的问题,请原谅,但我想知道Java中的枚举是否与整数类似。我的意思是,假设我有一个enum声明为

public enum Colour {
    BLACK, WHITE
}
我能像在INT之间切换那样在它们之间切换吗?像

Colour newColour = !newColour;

因为据我所知,它们基本上都是C中的INT。它有什么相似之处吗?

当然,您可以通过在枚举中定义
toggle
方法来实现相同的行为:

enum Colour {
    BLACK, WHITE;

    Colour toggle() {
        if (this.equals(BLACK))
            return WHITE;
        else
            return BLACK;
    }
}

用法是:
color newcolor=oldColour.toggle()

类似于@alfasin的解决方案,但更符合您的问题:

public enum Colour {
    BLACK, WHITE;

    public Colour toggle() {
        return values()[~ordinal() & 1];
    }
}

你可以这样做,支持你喜欢的颜色。这样,在返回补码的方法中就没有分支逻辑

public enum Colour {
    BLACK(null), WHITE(BLACK), RED(null), CYAN(RED);

    private Colour complement;

    private Colour(Colour complement) {
        this.complement = complement;
        if (complement != null) {
            complement.complement = this;
        }
    }

    public Colour getComplement() {
        return complement;
    }
}

以下是一个更简短的版本:

private enum Colour {

    WHITE, BLACK;

    public Colour toggleMode() {
        return this.equals(WHITE) ? BLACK: WHITE;
    }
}

不,你不能那样做。Java中的
int
s也无法实现这一点。如果要查找按位not运算符,则这就是
~
(在C和Java中都是这样)。逻辑not(
)不能与Java中的
int
操作数一起使用。但是Java
enum
常量既不是
int
s也不是
boolean
s;它们是对象,所以你不能这么做。相关:当你试图编译
color newcolor=!新颜色?注意,您也可以使用
this==BLACK
,因为它可能更容易阅读和快速返回值()
坚持按位技巧。@CostiCiudatu
values()
每次都会创建一个新数组,因此将值复制到新数组的成本超过了从位技巧中获得的任何性能提升。@Andreas这是一个有效点;然而,这并不是为了提高性能。@Clashsoft在
=
上使用
等于
是一个好习惯。大多数情况下,您真正想要的是
等于
,但在这种特定情况下,它们确实会返回类似的结果。至于可读性,我认为这是一个意见问题。至于性能,即使有差异,也可以忽略不计。或者
1-ordinal()
?谢谢!实际上,我只是在寻找一种切换值的方法,我不需要它是一个按位的技巧,但我很感激这个答案