# AI 交互记录 - 车辆实体类 Car 开发 ## 一、需求分析 ### 实验要求 1. 实现完整的封装 2. 构造方法重载(多个构造方法) 3. 熟练使用 this 关键字 4. 培养数据校验意识 5. 代码简洁明了,有注释 ### 功能需求 - 包含车辆基本信息(品牌、型号、年份、价格、颜色、车牌号) - 提供多种创建对象的方式 - 对外提供安全的访问接口 - 对输入数据进行有效性验证 --- ## 二、AI 交互过程 ### 第一轮:代码编写请求 **用户提问**: > 实现一个封装完整的实体类一一车辆管理系统中的 Car 类。 > 根据以上要求和信息帮我写一份 Java 文件,要求简洁明了,且有注释 **AI 响应要点**: #### 1. 类结构设计 public class Car { // 私有属性 - 封装的核心 private String brand; // 品牌 private String model; // 型号 private int year; // 生产年份 private double price; // 价格 private String color; // 颜色 private String licensePlate; // 车牌号 } #### 2. 构造方法重载(3 个) - **无参构造**:提供默认值 - **简化版构造**(3 参数):brand, model, price - **全参构造**(6 参数):所有属性 #### 3. this 关键字的三种用法 // 用法 1:区分成员变量和局部变量 this.brand = brand; // 用法 2:构造方法之间互相调用 public Car(String brand, String model, double price) { this(brand, model, 2026, price, "标准色", "待上牌"); } // 用法 3:在 setter 中返回当前对象(可选) #### 4. 数据校验实现 // 年份校验:1900-2026 public void setYear(int year) { if (year >= 1900 && year <= 2026) { this.year = year; } else { System.out.println("错误:年份必须在 1900-2026 之间!"); this.year = 2026; } } // 价格校验:必须大于 0 public void setPrice(double price) { if (price > 0) { this.price = price; } else { System.out.println("错误:价格必须大于 0!"); this.price = 0.0; } } // 字符串校验:不能为空 public void setBrand(String brand) { if (brand != null && !brand.trim().isEmpty()) { this.brand = brand; } else { System.out.println("错误:品牌名称不能为空!"); } } #### 5. 测试代码设计 AI 提供了 5 组测试用例: - 测试 1:无参构造方法 - 测试 2:简化版构造方法 - 测试 3:全参构造方法 - 测试 4:修改车辆信息(使用 setter) - 测试 5:数据校验测试(故意传入非法值) --- ### 第二轮:代码审查询问 **用户提问**: > 我的类是否满足封装原则?有哪些改进建议? **AI审查结果**: #### 已满足的封装原则 #### 💡 改进建议 ##### 建议 1:增强数据校验 // 建议:更严格的业务规则校验 public void setYear(int year) { int currentYear = java.time.Year.now().getValue(); if (year >= 1900 && year <= currentYear) { this.year = year; } else { throw new IllegalArgumentException( "年份必须在 1900-" + currentYear + "之间,当前值为:" + year ); } } ##### 建议 2:添加不可变字段的考虑 // 如果某些属性创建后不应该修改,可以设为 final private final String licensePlate; // 车牌号一旦分配不应修改 // 对应的 setter 可以移除或添加限制逻辑 public void setLicensePlate(String licensePlate) { if (this.licensePlate.equals("未上牌") || this.licensePlate.equals("待上牌")) { this.licensePlate = licensePlate; } else { System.out.println("错误:车牌号已分配,不能修改!"); } }