Book类应以ISBN为唯一标识,重写toString()和equals()/hashCode(),保持POJO纯粹性;LibrarySystem用Map管理图书,方法命名直白,输入需防护处理;库存变更须封装为decrease/increaseStock并校验合法性。

Book 类设计要先想清楚核心属性和行为
- 图书信息通常包括
isbn、title、author、price、stock,其中isbn最适合作为唯一标识(别用id自增主键,现实场景中 ISBN 才是业务主键) -
toString()和equals()/hashCode()必须重写,否则集合操作(如ArrayList.contains()或HashMap查找)会失效——很多人卡在这一步,以为数据“丢了”,其实是没重写equals() - 不要在
Book里塞 I/O 操作或数据库逻辑,它就该是个纯粹的数据载体(POJO),否则后续扩展借阅、库存预警等功能时会越改越乱
LibrarySystem 是协调者,不是万能管家
- 它负责持有
List或Map(推荐后者,用isbn当 key,查书快且天然去重) - 增删改查方法命名要直白:
addBook(Book book)、findBookByIsbn(String isbn)、updateStock(String isbn, int delta)——避免用modify()这种模糊名,调试时根本猜不出干了啥 - 别在方法里直接
System.out.println(),输出逻辑应交给调用方(比如Main类)。否则单元测试没法断言,日志也混在业务流里
Scanner 输入处理容易崩,必须做防护
- 用户输个字母进价格字段?
nextInt()会抛InputMismatchException并卡住输入流。统一用nextLine()读字符串,再用Integer.parseInt()或Double.parseDouble()转,外层包try-catch - 输入空字符串或纯空格怎么办?
trim().isEmpty()得判,否则isbn存了个空串,后面所有查找都返回null,还不好定位 - 多次输入后记得清空缓冲区:比如读完数字再读字符串,得加一句
scanner.nextLine(),不然下一个nextLine()会直接返回空行
真正难的不是写完功能,而是让 Book 的 stock 变更安全、可追溯
立即学习“Java免费学习笔记(深入)”;
- 直接暴露
setStock(int stock)是危险的,应该只提供decreaseStock(int count)和increaseStock(int count),内部校验是否超卖 - 如果未来要加日志或通知(比如库存低于 5 本发提醒),这些方法就是天然的切面入口;而裸字段赋值做不到这点
- 还有,别忘了
stock是整数,但业务上不能为负——构造函数或 setter 里就得 throwIllegalArgumentException,而不是等运行时出错才暴露问题










