在java中使用此函数在enum类函数中更改enum的值

goucqfw6  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(610)

我有一个名为entry的java枚举。我的目标是创建一个函数,将枚举值更改为另一个值。如果我的枚举值是x,我希望它变成y,反之亦然。我试着写的代码在这里。但这不会编译,它说变量应该在我使用的地方 this .

public enum Entry {
    X,
    O;

    public void switchEntry(){
        this == Entry.X? this = Entry.O: Entry.X ;
    }
}

我还想知道是否可以不在枚举类中使用附加值变量。谢谢您。如果这是个愚蠢的问题,我道歉。

bpzcxfmw

bpzcxfmw1#

不能切换枚举本身的值。您可以在类中使用枚举,并在其中切换值:

class Test {

    private Entry entry = Entry.X;

    public void switchEntry() {
        entry = entry == Entry.X ? Entry.O : Entry.X;
    }
}

enum Entry {
    X, O;
}
fcipmucu

fcipmucu2#

不能将一个枚举更改为另一个枚举。但是,可以更新枚举变量以引用另一个枚举值。

public enum Entry {
    X,
    O;

    public Entry switchEntry() {
        return (this == X ? O : X);
    }
}
Entry e = Entry.X;

e = e.switchEntry();
ogsagwnx

ogsagwnx3#

阻止你这么做的主要原因是 thisfinal . 你不能重新分配 this . 这种限制是有充分理由的。
但是,即使你可以重新分配 this ,您的方法没有多大意义,因为只有两个 Entry ,曾经- Entry.X 以及 Entry.O :
§8.9
枚举类型除了由其枚举常量定义的示例外,没有其他示例。试图显式示例化枚举类型是编译时错误
如果你真的这么做了:

Entry.X.switchEntry();

您将无法访问最初由引用的对象 Entry.X 从那以后!因为 switchEntryEntry.XEntry.O ! 现在两者都有了 Entry.X 以及 Entry.O 指的是同一个对象!
如果我有一个包含 getEntry 方法返回一个私有字段 entry ,没有为 entry . 如果调用了(这是完全有效的java代码):

getEntry().switchEntry();

那会不会把我的隐私 entry 变量?如果是这样的话,你刚刚破坏了封装!或者它会做一些愚蠢的事情,比如 getEntry() = Entry.O; ?
您是否看到了允许您实现 switchEntry ?
无论如何,您应该编写一个返回 Entry . 然后你可以使用 = 在呼叫站点分配给你喜欢的任何东西。

相关问题