Book类需含isbn(重写equals/hashCode)、title、author、isAvailable(只读);Reader类需含id(String)、name、borrowedBooks(List);借阅须按“查→判→改→存”四步,避免状态错乱。

Java里开发一个简单的图书馆管理系统,核心不是堆功能,而是先稳住数据模型和操作边界——书、读者、借阅这三类实体的关系必须清晰,否则后期改起来比重写还累。
怎么设计 Book 和 Reader 的基础类
别急着加 Spring Boot 或数据库,先用纯 Java 写清楚两个核心类的字段和行为。Book 至少要有 isbn(唯一标识)、title、author、isAvailable;Reader 要有 id(建议用字符串,避免和数据库主键混淆)、name、borrowedBooks(List
-
isbn必须重写equals()和hashCode(),否则后续用HashSet或HashMap查书会失效 - 不要在
Book里直接存读者引用,借阅关系应由单独的BorrowRecord类或管理类维护,避免循环引用和状态不一致 -
isAvailable是只读状态,靠借/还操作间接修改,不提供setAvailable(true/false)这种危险接口
借书逻辑怎么写才不会出并发或状态错乱
哪怕单线程运行,也要按“查→判→改→存”四步走,缺一不可。常见错误是:先查可用,再直接设为不可用,中间如果其他操作插进来(比如另一线程也查到可用),就会重复借出同一本书。
- 查书时用
books.stream().filter(b -> b.getIsbn().equals(isbn)).findFirst(),别用get(0)防越界 - 判断必须同时满足:
book != null && book.isAvailable(),缺任一都拒绝借出 - 借出动作包括两件事:设置
book.isAvailable = false,并把该book加入读者的borrowedBooks列表 - 如果用
ArrayList存书,记得借出后调用Collections.unmodifiableList()封装返回,防止外部误改
控制台交互怎么避免 Scanner 输入阻塞或类型错
Scanner 是新手最易翻车的地方:输入数字后回车,下一次 nextLine() 会直接读到空行;输入非数字时 nextInt() 不清缓存,导致死循环。
立即学习“Java免费学习笔记(深入)”;
- 统一用
scanner.nextLine()读所有输入,再用Integer.parseInt()或正则校验,别混用nextInt()和nextLine() - ISBN 输入建议用字符串接收(如 "978-0-306-40615-7"),别强转数字,避免前导零丢失和格式崩溃
- 菜单选择用
switch (input.trim()),加trim()防空格干扰 - 每次操作完加一句
System.out.println("---");分隔,不然输出糊成一片,调试时根本分不清哪次的结果
真正难的不是写完能跑,而是当你要加“逾期计算”“分类统计”“持久化到文件”时,发现 Book 类里塞了日期格式化逻辑、Reader 里写了文件写入方法——这种职责混杂会让后续每一步都变慢。留好扩展口子,比早早上框架重要得多。










