实体类应封装业务核心数据与状态,通过private属性+public方法控制访问,只保留必需字段、直命名、去冗余、护敏感;setter嵌入校验,状态变更内聚于语义化方法;构造器强制关键字段初始化。

实体类封装核心业务数据与状态,关键在于把业务中真实存在的“事物”及其关键特征、约束和行为,用 private 属性 + public 方法 的方式组织起来,让外部只能按规则读写,不能绕过逻辑直接操作。
明确实体边界,只保留业务必需字段
一个实体不是数据容器,而是业务概念的映射。比如“订单”实体,不放用户头像、商品图片等展示字段;只保留订单号、下单时间、总金额、状态(待支付/已发货/已完成)等驱动业务流转的核心状态。
- 字段命名直指业务含义:用
orderStatus而非status,用actualPaidAmount而非money - 避免冗余字段:不存“订单金额 × 折扣率”这种可计算值,只存原始金额和折扣率,由方法统一计算
- 敏感字段默认私有:如
idCardNumber、bankAccount必须private,不提供 setter 或仅限内部初始化
用 getter/setter 控制访问,嵌入业务校验
setter 不是简单赋值通道,而是业务规则的第一道防线。例如订单金额不能为负、状态变更必须符合流程(不能从“已完成”退回“待支付”)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 金额类字段:setter 中校验 ≥ 0,且保留两位小数精度(用
BigDecimal) - 状态字段:setter 不允许任意设置,只提供
confirmPayment()、shipGoods()等语义化方法,内部自动更新状态并校验前置条件 - 日期字段:用
LocalDateTime,setter 接收字符串时先解析再校验是否为有效时间(如不能晚于当前时间)
把状态变更逻辑内聚到实体方法中
状态不是静态值,而是随行为演进的。把“怎么变”封装进实体,比在 Service 层一堆 if-else 更可靠。
- 订单支付成功后,不仅要改状态,还要生成支付流水、更新库存、触发通知——这些都应在
paySuccess()方法里完成 - 退货申请需检查是否超期、是否已发货、是否有未完成售后单,这些判断逻辑写在
applyRefund()内部,而非散落在调用方 - 提供只读视图方法:如
isPayable()、canCancel(),返回布尔值表达当前状态下的业务能力
构造器强制关键状态初始化
实体一旦创建,核心状态就应处于合法、可用的初始态。避免出现“new 出来但缺订单号、金额为 0”的半成品对象。
- 提供带参构造器,要求传入不可为空/不可变的关键字段(如
orderId、userId) - 无参构造器保留给 ORM 框架使用,但内部设默认安全值:状态设为
PENDING,时间设为LocalDateTime.now() - 对必填字段做空值校验:构造器中检查
Objects.requireNonNull(orderId, "订单号不能为空")
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










