如何设计一个可扩展的问答题库类(Java 教程)

夜雪君_3771

夜雪君_3771

2026-02-20

968人浏览

原创

如何设计一个可扩展的问答题库类(Java 教程)

本文介绍一种面向对象、可维护性强的 java 问答系统设计方法:使用不可变 record 封装题目与选项,分离数据存储(questionsrepository)与交互逻辑(quiz),支持任意数量题目、随机顺序展示及多选反馈。

本文介绍一种面向对象、可维护性强的 java 问答系统设计方法:使用不可变 record 封装题目与选项,分离数据存储(questionsrepository)与交互逻辑(quiz),支持任意数量题目、随机顺序展示及多选反馈。

在开发测验类应用(如小考、知识竞赛或学习工具)时,若采用硬编码多个 new QuestionsLevelEasy(...) 实例并手动管理列表,不仅代码冗余、难以扩展,更违背了单一职责和开闭原则。理想的设计应满足:✅ 题目与答案结构清晰;✅ 支持 N 个选项(非仅单数字答案);✅ 数据加载与用户交互解耦;✅ 易于增删题目,无需修改业务逻辑。

✅ 推荐方案:用 record + 分层架构实现

1. 定义不可变题干模型(Question record)

Java 14+ 引入的 record 是表示只读数据载体的理想选择——自动生成构造器、getter、equals/hashCode/toString,且语义上明确表达“数据不可变”,天然规避并发与误修改风险:

public record Question(String ask, List<string> answers, int solutionOrdinal) {
    // solutionOrdinal:正确答案在 answers 列表中的索引(从 1 开始,便于用户输入)
}</string>

⚠️ 注意:solutionOrdinal 使用 1-based 索引(即用户输入 1 表示第一个选项),而非编程常用的 0-based,显著提升用户体验与代码可读性。

2. 隔离数据源:QuestionsRepository

该类唯一职责是提供题目集合,当前以硬编码方式初始化,但未来可无缝替换为 CSV 解析、JSON 加载或数据库查询:

import java.util.List;

public class QuestionsRepository {
    public List<question> fetchQuestions() {
        return List.of(
            new Question("最佳编程语言?",
                List.of("C", "C++", "Java"),
                3 // Java 是第 3 个选项 → 用户输入 3 即正确
            ),
            new Question("不存在的颜色是?",
                List.of("品红(Magenta)", "红色", "蓝色"),
                1 // 品红是加色模型中无对应波长的“非光谱色”
            ),
            new Question("推荐的编程字体?",
                List.of("Pragmata Pro", "JetBrains Mono", "Comic Sans MS"),
                1
            )
        );
    }
}</question>

✅ 优势:新增题目只需在 List.of(...) 中追加一行,零侵入现有逻辑。

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载

3. 封装交互流程:Quiz 类

Quiz 不负责生成题目,只专注呈现、接收输入、校验反馈——这是典型的控制反转(IoC) 实践:

import java.util.*;

public class Quiz {
    private final List<question> questions;

    public Quiz(List<question> questions) {
        // 创建可变副本并打乱顺序,再转为不可变视图
        List<question> shuffled = new ArrayList(questions);
        Collections.shuffle(shuffled);
        this.questions = List.copyOf(shuffled); // 安全防御:防止外部修改
    }

    public void present() {
        Scanner scanner = new Scanner(System.in);
        System.out.printf("? 本次测验共 %d 题,开始答题!\n", questions.size());

        for (int i = 0; i <blockquote>
<p>? 关键设计点:</p>
<ul>
<li>Collections.shuffle() 替代 Random.nextInt() 随机取题,避免重复抽取或遗漏;</li>
<li>List.copyOf() 保证内部状态不可变,增强线程安全与封装性;</li>
<li>输入异常处理(如用户输字母)提升鲁棒性;</li>
<li>输出含题号、明确提示,符合 CLI 友好规范。</li>
</ul>
</blockquote>
<h4>4. 组装运行:App 主类</h4>
<pre class="brush:php;toolbar:false;">public class App {
    public static void main(String[] args) {
        QuestionsRepository repo = new QuestionsRepository();
        Quiz quiz = new Quiz(repo.fetchQuestions());
        quiz.present();
    }
}

? 总结与进阶建议

维度 当前实现 后续可扩展方向
数据持久化 硬编码 List.of(...) 改为读取 questions.json 或 SQLite
难度分级 所有题目混入同一列表 在 Question 中增加 enum Level {EASY, MEDIUM, HARD} 字段
统计反馈 仅输出对错 记录答对数、耗时、错题重练列表
UI 层 控制台(CLI) 迁移至 JavaFX / Swing / Web(Spring Boot + Thymeleaf)

? 核心启示:好的类设计不在于功能多,而在于职责纯、边界清、变化少。
将“题目是什么”(data)、“题目从哪来”(repository)、“怎么问用户”(quiz)三者彻底分离,你的代码才能真正支撑 30 题、300 题,甚至 3000 题的平滑演进。

现在,你已掌握构建专业级问答系统的核心范式——简洁、健壮、可生长。下一步,就是把它用在你的项目中,并持续迭代。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2791

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

497

25

spring boot框架优点
spring boot框架优点

spring boot框架的优点有简化配置、快速开发、内嵌服务器、微服务支持、自动化测试和生态系统支持。本专题为大家提供spring boot相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

691

5

spring框架有哪些
spring框架有哪些

spring框架有Spring Core、Spring MVC、Spring Data、Spring Security、Spring AOP和Spring Boot。详细介绍:1、Spring Core,通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了组件之间的耦合度;2、Spring MVC,提供基于模型-视图-控制器的架构,用于开发灵活和可扩展的Web应用程序等。

2023.10.12

1455

7

Java Spring Boot开发
Java Spring Boot开发

本专题围绕 Java 主流开发框架 Spring Boot 展开,系统讲解依赖注入、配置管理、数据访问、RESTful API、微服务架构与安全认证等核心知识,并通过电商平台、博客系统与企业管理系统等项目实战,帮助学员掌握使用 Spring Boot 快速开发高效、稳定的企业级应用。

2025.08.19

5406

10

Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性
Java Spring Boot 4更新教程_Java Spring Boot 4有哪些新特性

Spring Boot 是一个基于 Spring 框架的 Java 开发框架,它通过 约定优于配置的原则,大幅简化了 Spring 应用的初始搭建、配置和开发过程,让开发者可以快速构建独立的、生产级别的 Spring 应用,无需繁琐的样板配置,通常集成嵌入式服务器(如 Tomcat),提供“开箱即用”的体验,是构建微服务和 Web 应用的流行工具。

2025.12.22

436

5

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

2025.12.24

680

18

Spring Boot企业级开发与MyBatis Plus实战
Spring Boot企业级开发与MyBatis Plus实战

本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。

2026.02.11

405

24

Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

2026.02.12

391

18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习