如果使用枚举,如何过多清除代码

时间:2019-04-23 11:02:37

标签: java java-8 code-cleanup

我有以下代码要编写。它采用一种枚举类型并返回其他枚举值。

如何删除代码中过多的条件(如果有的话)并使之干净?
private static QuestionType parseQuestionType(QuestionTypeInfo questionTypeInfo) {
        if (questionTypeInfo instanceof OpenEndedTextQuestionTypeInfo) {
            return QuestionType.OPEN_ENDED;
        } else if (questionTypeInfo instanceof MultiChoiceQuestionTypeInfo) {
            return QuestionType.MULTI_CHOICE;
        } else if (questionTypeInfo instanceof MatrixSinglePerRowQuestionTypeInfo) {
            return QuestionType.MATRIX_SINGLE_PER_ROW;
        } else if (questionTypeInfo instanceof OpenEndedTextQuestionTypeInfo) {
            return QuestionType.OPEN_ENDED;
        } else if (questionTypeInfo instanceof MatrixMultiPerRowQuestionTypeInfo) {
            return QuestionType.MATRIX_MULTI_PER_ROW;
        } else if (questionTypeInfo instanceof MatrixSideBySideQuestionTypeInfo) {
            return QuestionType.MATRIX_SIDE_BY_SIDE;
        } else if (questionTypeInfo instanceof MatrixSpreadSheetQuestionTypeInfo) {
            return QuestionType.MATRIX_SPREAD_SHEET;
        } else if (questionTypeInfo instanceof DataListQuestionTypeInfo) {
            return QuestionType.DATA_LIST;
        } else if (questionTypeInfo instanceof FileUploadQuestionTypeInfo) {
            return QuestionType.FILE_UPLOAD;
        } else if (questionTypeInfo instanceof InteractiveSlidingScaleQuestionTypeInfo) {
            return QuestionType.INTERACTIVE_SLIDING_SCALE;
        } else if (questionTypeInfo instanceof NetPromoterQuestionTypeInfo) {
            return QuestionType.NET_PROMOTER;
        } else if (questionTypeInfo instanceof RankOrderQuestionTypeInfo) {
            return QuestionType.RANK_ORDER;
        } else if (questionTypeInfo instanceof PresentationHeaderQuestionTypeInfo) {
            return QuestionType.PRESENTATION_HEADER;
        } else if (questionTypeInfo instanceof PresentationHtmlQuestionTypeInfo) {
            return QuestionType.PRESENTATION_HTML;
        } else if (questionTypeInfo instanceof AutoIncrementQuestionTypeInfo) {
            return QuestionType.AUTO_INCREMENT;
        } else if (questionTypeInfo instanceof SingleChoiceQuestionTypeInfo) {
            return QuestionType.SINGLE_CHOICE;
        }

        return null;
}

2 个答案:

答案 0 :(得分:7)

您可以按照其他建议使用Map,但我个人会使用委托(如果您的情况有意义)。在QuestionTypeInfo接口中,声明一个抽象方法getQuestionType,该方法返回QuestionType枚举的实例,并在其所有实现中使用适当的值覆盖它。

interface QuestionTypeInfo {
    QuestionType getQuestionType();
}

enum OpenEndedTextQuestionTypeInfo implements QuestionTypeInfo {
    @Override
    public QuestionType getQuestionType() {
        return QuestionType.OPEN_ENDED;
    }
}

然后,在parseQuestionType方法中,只需使用:

private static QuestionType parseQuestionType(QuestionTypeInfo questionTypeInfo) {
        return questionTypeInfo.getQuestionType();
}

答案 1 :(得分:2)

如果可以保证,这些类型是唯一存在的类型,并且不存在其他子类,则可以创建具有以下签名的映射:

Map<Class<? extends QuestionTypeInfo>, QuestionType> mapping;

然后建立映射。例如。像这样:

mapping.put(MatrixSinglePerRowQuestionTypeInfo.class, QuestionType.MATRIX_SINGLE_PER_ROW);

然后您可以像这样进行简单查找:

return mapping.get(questionTypeInfo.getClass());

这仅在例如MatrixSinglePerRowQuestionTypeInfo是一个没有附加子类的类。由于Map在内部使用equals方法来检查给定密钥是否存在。请参阅此简化示例,这将破坏我提议的逻辑(但将与您现有的逻辑一起使用!):

// create a subclass
class SomeSubClass extends MatrixSinglePerRowQuestionTypeInfo { ... }

// initialize the mapping
mapping.put(MatrixSinglePerRowQuestionTypeInfo.class, Foo.BAR);

// in your lookup
mapping.get(MatrixSinglePerRowQuestionTypeInfo.class); // returns Foo.BAR as expected
mapping.get(SomeSubClass.class); // returns null??