java—检查数据类型以构建对象的另一种方法

hc8w905p  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(311)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

上个月关门了。
改进这个问题
我正在尝试构建一个对象,它基于不同的数据类型使用不同的方法。i、 它不同于 withBooleanValue , withStringValue 以及 withDateValue 取决于数据类型。我拥有的是一个字符串,根据该字符串是什么(布尔值、字符串或日期),我需要构建这个对象。下面是我是怎么做的。

private List<Answer> getAnswers(Set<Question> questions) {
        List<Answer> answers = new ArrayList<>();
        questions.forEach(question -> {
            Answer.Builder answer = Answer.builder()
                    .withQuestion(question.question());
            if (BooleanUtils.toBooleanObject(question.value()) != null) {
                answer.withValue(AnswerValue.builder()
                        .withBooleanValue(BooleanUtils.toBoolean(question.value()))
                        .build());
            } else {
                try {
                    Date dateValue = DateUtils.parseDate(question.value(), new String[]{"dd-MM-YYYY"});
                    answer.withValue(AnswerValue.builder()
                            .withDateValue(dateValue)
                            .build());

                } catch (ParseException e) {
                    answer.withValue(AnswerValue.builder()
                            .withStringValue(question.value())
                            .build());
                }
            }
            answers.add(answer.build());
        });
        return answers;
    }

在java8中有更好的方法吗?不知何故,ifs和try-catch语句使它看起来非常复杂,我想用一种更好的方法来减少行数和复杂性。任何建议都将不胜感激。

xggvc2p6

xggvc2p61#

就重构代码而言,我会从以下内容开始(由于我没有所有的类,所以它不会编译,所以可能会有一些错误):

private List<Answer> getAnswers(Set<Question> questions) {
        List<Answer> answers = new ArrayList<>();
        questions.forEach(question -> {
            Answer.Builder answer = Answer.builder()
                    .withQuestion(question.question())
                    .withValue(parseAnswerValue(question));

            answers.add(answer.build());
        });
        return answers;
    }

    private AnswerValue parseAnswerValue(Question question) {
        Optional<AnswerValue> answerOptional = parseBoolean(question);
        if (answerOptional.isEmpty()) {
            answerOptional = parseDate(question);
        }

        return answerOptional.isEmpty() ? parseString(question) : answerOptional.get();
    }

    private Optional<AnswerValue> parseBoolean(Question question) {
        if (BooleanUtils.toBooleanObject(question.value()) != null) {
            return Optional.of(AnswerValue.builder()
                    .withBooleanValue(BooleanUtils.toBoolean(question.value()))
                    .build());
        }
        return Optional.empty();
    }

    private Optional<AnswerValue> parseDate(Question question) {
        try {
            Date dateValue = DateUtils.parseDate(question.value(), new String[]{"dd-MM-YYYY"});
            return Optional.of(AnswerValue.builder()
                    .withDateValue(dateValue)
                    .build());

        } catch (ParseException e) {
            return Optional.empty();
        }
    }

    private AnswerValue parseString(Question question) {
        return AnswerValue.builder()
                .withStringValue(question.value())
                .build();
    }

然后像这样。它还需要有一个全球性的日期,这可能是值得怀疑的。也可以传递question.value()代替传递question。

private List<Answer> getAnswers(Set<Question> questions) {
        List<Answer> answers = new ArrayList<>();
        questions.forEach(question -> {
            Answer.Builder answer = Answer.builder()
                    .withQuestion(question.question())
                    .withValue(parseAnswerValue(question));

            answers.add(answer.build());
        });
        return answers;
    }

    private AnswerValue parseAnswerValue(Question question) {
        AnswerValue.Builder answerBuilder = AnswerValue.builder();

        if (isBoolean(question)) {
            answerBuilder.withBooleanValue(BooleanUtils.toBoolean(question.value()));
        } else if (isDate(question)) {
            answerBuilder.withDateValue(dateValue);
        } else {
            answerBuilder.withStringValue(question.value());
        }

        return answerBuilder.build();
    }

    private boolean isBoolean(Question question) {
        return BooleanUtils.toBooleanObject(question.value()) != null;
    }

    private boolean isDate(Question question) {
        try {
            dateValue = DateUtils.parseDate(question.value(), new String[]{"dd-MM-YYYY"});
            return true;
        } catch (ParseException e) {
            return false;
        }
    }

相关问题