确保使用每个枚举值

Hex*_*lex 2 java enums

如果我使用枚举来确定任务的类型.

public enum TaskType {
    TYPE_ONE("Type1"),TYPE_TWO("Type2"),TYPE_THREE("Type3");

    private final String type;

    private StageType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return type;
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何在我的申请中保证一点

if(taskType == TaskType.TYPE_ONE) {
    typeOneProcessing();
} else if(taskType == TaskType.TYPE_TWO) {
    typeTwoProcessing();
} else if(taskType == TaskType.TYPE_THREE) {
    typeThreeProcessing();
}
Run Code Online (Sandbox Code Playgroud)

是否使用了每个枚举值?
我的意思是如果有一天我需要添加一个新的TYPE_FOUR,我需要找到我使用枚举的代码中的每个地方,所以我问自己是否有更好的方法以便我要么避免枚举并使用其他的概念或我可以确保在该段代码中使用枚举的每个值.

Old*_*eon 5

有findbugs类型的工具,但你可以考虑完全删除if-then-else并将处理放在其中enum.在这里,添加一个新的TYPE_FOUR将迫使你写它的doProcessing()方法.

public interface DoesProcessing {

    public void doProcessing();
}

public enum TaskType implements DoesProcessing {

    TYPE_ONE("Type1") {
                @Override
                public void doProcessing() {

                }
            },
    TYPE_TWO("Type2") {
                @Override
                public void doProcessing() {

                }
            },
    TYPE_THREE("Type3") {
                @Override
                public void doProcessing() {

                }
            },
    TYPE_FOUR("Type4") {
        // error: <anonymous com.oldcurmudgeon.test.Test$TaskType$4> is not abstract and does not override abstract method doProcessing() in DoesProcessing
            };

    private final String type;

    private TaskType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return type;
    }
}

public void test() {
    DoesProcessing type = TaskType.TYPE_TWO;
    type.doProcessing();
}
Run Code Online (Sandbox Code Playgroud)

如果你更喜欢一种abstract方法,那么这是有效的:

public enum TaskType {

    TYPE_ONE("Type1") {
                @Override
                public void doProcessing() {

                }
            },
    TYPE_TWO("Type2") {
                @Override
                public void doProcessing() {

                }
            },
    TYPE_THREE("Type3") {
                @Override
                public void doProcessing() {

                }
            };

    private final String type;

    private TaskType(String type) {
        this.type = type;
    }

    // Force them all to implement doProcessing.
    public abstract void doProcessing();

    @Override
    public String toString() {
        return type;
    }
}
Run Code Online (Sandbox Code Playgroud)