java实体类需严格封装:字段私有且禁用public/protected,基本类型优先包装类,金额用bigdecimal,时间用localdatetime/zoneddatetime;getter/setter须含校验与转换逻辑,敏感字段getter掩码处理,只读字段省略setter;推荐带参构造或静态工厂确保必填;实体应内聚轻量业务方法如isexpired()、getdiscountedprice()。

Java 实体类要真正符合封装原则,关键不是“把字段设成 private 就完事”,而是通过访问控制 + 明确职责 + 可控交互,让对象的状态只能被安全、一致地读写。
字段必须私有,且禁止暴露内部结构
所有业务属性一律用 private 修饰,不提供 public 或 protected 字段。这不是为了“藏起来”,而是切断外部绕过逻辑直接赋值的路径。比如年龄不能是 public int age,否则 user.age = -100 就直接生效,后续所有校验都失效。
- 基本类型优先用包装类(Integer、Long、Boolean),便于区分“未设置”和“值为0/ false”
- 金额、精度敏感数据必须用 BigDecimal,不用 double/float
- 时间类型统一用 LocalDateTime 或 ZonedDateTime,避免 Date 的时区混乱和可变性
getter/setter 要有业务语义,不是机械生成
getter 不只是 return field;setter 也不只是 this.field = value。它们是封装的“门禁”——在这里做合法性检查、状态同步、数据转换。
- setName() 中校验非空、长度、非法字符;setPrice() 中拒绝负数并自动保留两位小数
- 敏感字段(如密码)的 getter 可返回 null 或掩码("***"),不暴露原始值
- 某些字段只读(如 createTime),就只提供 getter,不写 setter
- 避免为所有字段无差别生成 setter——不是每个属性都该被随意修改
构造逻辑要完整,禁止“裸 new”后靠 set 填充
实体类应体现“有效对象”的初始状态。无参构造器是框架所需,但业务上更推荐使用带参构造器或静态工厂方法来强制关键字段必填。
- 例如:UserInfo(String userName, String email) { … },确保新建对象至少含用户名和邮箱
- 静态工厂方法如 of(String name, String email) 更具可读性,还能返回子类或缓存实例
- 配合 Lombok 的 @Builder(谨慎使用)时,务必加 @Builder.Default 或 requiredArgsConstructor,防止构建出半残对象
行为与数据绑定,避免贫血模型
封装不仅是“封住字段”,更是“把行为收进来”。实体类可以包含与自身状态强相关的轻量逻辑,比如:
- isExpired() 判断订单是否超时
- getDiscountedPrice(BigDecimal discountRate) 计算折后价
- toSummaryString() 返回格式化摘要,而非暴露所有字段再由外面拼接
这些方法操作的是自己的 private 字段,不依赖外部传入状态,既增强内聚,又防止业务规则散落在 service 层重复实现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











