gpt4 book ai didi

java - 枚举值的子类化

转载 作者:行者123 更新时间:2023-11-30 06:55:38 25 4
gpt4 key购买 nike

我希望能够对枚举中的某些值进行子类化,这样我就不必过多地重复代码。有什么办法可以做到这一点?这是我想要实现的目标的示例,Eclipse 很快告诉我这是一个令人厌恶的事情:

public enum Foo {
BAR {
@Override
public void taskA() {
System.out.println("A");
}

@Override
public void taskB() {}
},
BAZ extends BAR {
@Override
public void taskB() {
System.out.println("B");
}
};

public abstract void taskA();
public abstract void taskB();
}

BAR 将只有 taskA 的实现和一个空的 taskB,而 BAZ 将同时拥有这两种方法- BARtaskA 实现,以及它自己的 taskB 实现。

枚举声明后我没有改变它的值,为什么这不起作用?我可以在 BAZ 中调用 BARtaskA 方法,为什么我不能这样做?

最佳答案

I want to be able to subclass some values in an enum, in order that I don't have to repeat code too much.

在常量特定方法之间共享代码的常用方法是声明一个私有(private)静态方法(在枚举本身或实用程序帮助类中),其中包含您希望从常量特定方法访问的公共(public)代码.

例如……

public enum Foo {
BAR {
@Override
public void taskA() {
commonToTaskAandB();
System.out.println("B");
}

@Override
public void taskB() {}
},
BAZ {
@Override
public void taskB() {
commonToTaskAandB();
System.out.println("B");
}
};

public abstract void taskA();
public abstract void taskB();

private static void commonToTaskAandB() {
// shared code here
:
:
}

}

请注意,代码“BAZ extends Bar”是非法的,因为 BAZ 不是一种类型。 BAZ 是您的 Enum<Foo> 的一个实例类型。一个实例不能扩展另一个类型。将面向对象的原则(如继承)应用于枚举常量是不正确的,因为在 Java 中,枚举常量是类的实例,而不是类本身。

关于java - 枚举值的子类化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com