【发布时间】:2019-11-05 09:13:25
【问题描述】:
有没有办法根据枚举名称创建具有不同值的枚举抽象?
这是一个类,我会发现抽象枚举之类的东西很有用:
public class StatusUpdater {
public foo(bool one, bool two, bool three, AbstractEnum status) {
if (one) {
caseOne(status);
}
if (two) {
caseTwo(status);
}
if (three) {
caseThree(status);
}
}
private void caseOne(CaseOneEnum status) {
status.getValue(); //return case one value + case one implementation
}
private void caseTwo(CaseTwoEnum status) {
status.getValue(); //return case two value + case two implementation
}
private void caseThree(CaseThreeEnum status) {
status.getValue(); //return case three value + case three implementation
}
}
枚举的一个具体实现如下所示:
public enum CaseOneEnum {
STATUS_ONE("one"),
STATUS_TWO("two");
private final String status;
CaseOneEnum(final String status) {
this.status = status;
}
@Override
String getValue(){return status;}
另一个实现将具有相同的枚举名称,但值不同:
public enum CaseTwoEnum {
STATUS_ONE("oneTwo"),
STATUS_TWO("twoTwo");
private final String status;
CaseTwoEnum(final String status) {
this.status = status;
}
@Override
String getValue(){return status;}
调用 main 方法应该是这样的:
updater.foo(true, true, false, AbstractEnum.STATUS_ONE);
有没有一种方法可以创建一些“抽象”枚举,我可以将其传递给 foo() 并在检查案例后获取该枚举的具体实现。所有具体枚举的枚举名称将保持不变,但值会有所不同。我会想象一个像这样的“抽象”枚举:
public enum AbstractEnum {
STATUS_ONE,
STATUS_TWO;
@Override
String getValue();
有没有办法以一种简洁的方式实现类似的目标?
【问题讨论】:
-
你可以用一个接口代替
AbstractEnum,不是吗?枚举可以实现一个接口。 -
可能不是你要找的,但枚举可以有由每个常量实现的抽象方法:stackoverflow.com/questions/7413872/…
-
这个question 可能会有所帮助。其中一个答案建议检查 Effective Java 书,我也建议。
-
@ernest_k 是的,但是我可以通过界面访问状态名称吗?我需要类似 InterfaceEnum.STATUS_ONE 的东西来传递给主类 foo()。这应该是什么样子?
-
@LakyJ 不。如果您的方法也更改为接受接口类型(它们有不同的名称,所以应该不是问题)
标签: java inheritance enums abstraction