您的位置:首页 >Java实现简易商品订购系统教程
发布于2026-03-18 阅读(0)
扫一扫,手机访问
核心是类职责单一:Product管价格库存并提供reduceStock方法,User管基本信息,Order管订单关系;主键用Long或UUID;库存并发用实例级synchronized,多JVM需分布式锁;控制台输入统一用nextLine()转类型,避免Scanner陷阱。

核心是让每个类只管自己的事:Product 管价格和库存,User 管姓名和联系方式,Order 管下单时间、关联的 User 和多个 Product(用 List<Product> 或带数量的封装类)。别把库存扣减逻辑塞进 Order 类里——应该由 Product 自己提供 reduceStock(int quantity) 方法,返回 boolean 表示是否成功。
常见错误:用 String 存用户 ID 或商品 ID,后期查重、排序、关联都麻烦。直接用 Long 或 UUID 作为主键字段,初始化时自增或生成。
Product 至少含 id、name、price、stock,构造器校验 price > 0 且 stock >= 0Order 不存商品快照,只存 productId 和 quantity;真要留历史价格,得额外加 orderPrice 字段Order 构造时直接调用 product.reduceStock()——下单和扣库存应分两步,否则回滚困难单机环境用 synchronized 最简单,但必须锁对对象:不是锁 this,而是锁具体 Product 实例。比如 order.place() 内部调用 product.reduceStock(2) 前,先 synchronized(product) { ... }。如果用静态方法或锁整个类,会串行化所有商品操作,性能崩掉。
更稳妥的做法是把库存检查 + 扣减做成原子操作:
public boolean reduceStock(int quantity) {
synchronized (this) {
if (this.stock >= quantity) {
this.stock -= quantity;
return true;
}
return false;
}
}注意:如果后续扩展到多 JVM,synchronized 失效,就得换 Redis 分布式锁或数据库乐观锁(如 UPDATE product SET stock = stock - ? WHERE id = ? AND stock >= ?)。
别用 Scanner.nextLine() 后立刻跟 nextInt()——后者不吞换行符,下一次 nextLine() 会读到空字符串。统一用 nextLine(),再手动转类型:
String input = scanner.nextLine().trim();
if (!input.isEmpty()) {
try {
int choice = Integer.parseInt(input);
// 处理菜单选择
} catch (NumberFormatException e) {
System.out.println("请输入有效数字");
}
}System.out.print("\033[H\033[2J");(ANSI 转义序列)可提升体验(仅限支持终端)null 并提示“未找到订单”,否则控制流容易断裂有人图省事把 User、Product、Order 全塞进一个 ArrayList<Object>,靠 instanceof 判断类型。这会导致三类问题:
list.get(5).getName() 直接报错O(n) 且易漏判正确做法是三个独立容器:List<User> users、List<Product> products、List<Order> orders。ID 查找用 Map<Long, Product> 更快,但小项目用 stream().filter(p -> p.getId() == id).findFirst() 完全够用。
真正容易被忽略的是:订单里的商品引用,必须和 products 列表里的实例是同一个对象(或至少有相同 id),否则库存扣减会作用在副本上——这是新手最常调试半天的坑。
上一篇:Word多余空白页删除技巧
下一篇:驱动总裁游戏优化设置方法详解
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9