Java:具有具体实现的抽象枚举

标签 java inheritance enums abstraction

有没有办法根据枚举名称创建具有不同值的枚举抽象?

这是一个我会发现像抽象枚举这样有用的类:

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/

相关文章:

java - 如何在JSP中动态更改月份?

java - 使用java从浏览器运行用户系统中的exe文件

java - 方法注解继承

java - 我如何开始在 Eclipse 中设计 portlet?

java - 添加此方法后,我得到一个空指针

javascript - 如何将 JavaScript 原型(prototype)对象扩展两次?

c++ - 错误实现派生类构造函数 : "No Instance of Overloaded Function Matches the Specified Type

java - 你把你的字典数据放在哪里?

python - 枚举属性的属性?

java - 在 Java 中将 double(基本类型)转换为枚举类型