有没有办法根据枚举名称创建具有不同值的枚举抽象?
这是一个我会发现像抽象枚举这样有用的类:
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();
有没有一种方法可以巧妙地实现类似的目标?
最佳答案
事实上,所有枚举都是对象枚举的后代,这已经构成了一个通用类型,您可以使用它来实现独立于实际枚举实现的方法签名。
然后您的代码显示,对于每个“案例”,您确切地知道期望哪个枚举,因此您可以在调用专用方法时简单地类转换输入对象。
我对您的代码进行了一些修改以证明我的建议。
两个枚举实现
public enum CaseOneEnum {
STATUS_ONE("one"),
STATUS_TWO("two");
private final String status;
CaseOneEnum(final String status) {
this.status = status;
}
String getValue() {
return status;
}
}
public enum CaseTwoEnum {
STATUS_THREE("three"),
STATUS_FOUR("four");
private final String status;
CaseTwoEnum(final String status) {
this.status = status;
}
String getValue() {
return status;
}
}
StatusUpdater 类
public class StatusUpdater {
public String foo(int caze, Enum<?> status) {
if (caze == 1) {
return caseOne((CaseOneEnum) status);
}
if (caze == 2) {
return caseTwo((CaseTwoEnum) status);
}
return null;
}
private String caseOne(CaseOneEnum status) {
return status.getValue();
}
private String caseTwo(CaseTwoEnum status) {
return status.getValue();
}
}
需要注意的最重要的事情是 foo 方法签名在调用每个 case 方法时公开类型为 Enum 的参数和类转换。
最后是一个 JUnit 来演示。
public class StatusUpdaterTest {
@Test
public void testStatusUpdaterCase1() {
StatusUpdater updater = new StatusUpdater();
assertEquals(CaseOneEnum.STATUS_ONE.getValue(), updater.foo(1, CaseOneEnum.STATUS_ONE));
}
@Test
public void testStatusUpdaterCase2() {
StatusUpdater updater = new StatusUpdater();
assertEquals(CaseOneEnum.STATUS_TWO.getValue(), updater.foo(1, CaseOneEnum.STATUS_TWO));
}
@Test
public void testStatusUpdaterCase3() {
StatusUpdater updater = new StatusUpdater();
assertEquals(CaseTwoEnum.STATUS_THREE.getValue(), updater.foo(2, CaseTwoEnum.STATUS_THREE));
}
@Test
public void testStatusUpdaterCase4() {
StatusUpdater updater = new StatusUpdater();
assertEquals(CaseTwoEnum.STATUS_FOUR.getValue(), updater.foo(2, CaseTwoEnum.STATUS_FOUR));
}
}
希望这对您有所帮助!
干杯
关于Java:具有具体实现的抽象枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58707957/