Как очистить код слишком много, если еще с enum - PullRequest
3 голосов
/ 23 апреля 2019

У меня есть код ниже, чтобы написать.Он принимает один тип типа enum и возвращает другое значение enum.Как убрать слишком много, если еще условие в коде и сделать его чистым?

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 ]

7 голосов
/ 23 апреля 2019

Вы можете использовать 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();
}
2 голосов
/ 23 апреля 2019

Если вы можете гарантировать, что эти типы являются единственными, которые существуют, и что не существует других подклассов, вы можете создать отображение со следующей сигнатурой:

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??
...