Java继承设计核心资产实体应围绕“业务共性”建模,通过BaseAssetEntity(含ID、状态、软删除等共性)、领域抽象类(如TradeAssetEntity)、具体业务实体(如OrderAsset)三级分层,结合protected/final控制复用边界、模板方法预留扩展点,并辅以接口与组合提升灵活性。

用Java继承设计可复用的核心资产实体,关键不是堆砌层级,而是围绕“业务共性”建模,让不同业务线(如订单、支付、物流)能共享基础结构,又保留各自扩展空间。
明确核心资产的共性特征
先识别跨业务线都存在的字段和行为。比如:
- 所有资产都有唯一标识(id)、创建时间(createTime)、状态(status)、版本号(version)
- 都需支持软删除(isDeleted)、审计信息(creatorId, lastModifiedTime)
- 都应具备基础校验逻辑(如ID非空、状态合法)和通用日志打点能力
这些不随业务变化的部分,就该抽到顶层父类中,比如命名为 BaseAssetEntity。
分层设计:基类 → 领域抽象类 → 具体业务实体
避免“一竿子插到底”的单层继承。推荐三级结构:
立即学习“Java免费学习笔记(深入)”;
- BaseAssetEntity:只放JPA/Hibernate通用注解(@Id, @Version, @CreatedDate等)、基础getter/setter、通用校验方法(validateCommon())
- BusinessAssetEntity(可选):按领域进一步抽象,比如 TradeAssetEntity 封装交易相关共性(金额、币种、渠道码),供订单、退款、分账等子类继承
- OrderAsset、PaymentAsset、LogisticsAsset:各自添加专属字段(如orderNo、payChannel、trackingNo)和业务方法(confirmPayment()、triggerShipment())
用protected + final组合控制复用边界
不是所有父类成员都该被子类随意修改:
- 共性字段(如id、createTime)用 protected 修饰,子类可读可写,但建议通过构造器或Builder初始化,避免外部乱设
- 核心不变逻辑(如生成雪花ID、状态流转校验规则)封装成 final 方法,子类不可重写,保障一致性
- 预留扩展点用 template method 模式:父类定义流程骨架(save() → validate() → beforeSave() → persist()),把 beforeSave() 声明为 protected abstract,由各业务子类实现自己的前置处理
配合接口与组合提升灵活性
继承解决“is-a”,但业务中常有“has-a”或能力叠加需求:
- 给需要审计的实体统一加 Auditable 接口,而非强制继承含审计字段的父类
- 将“金额计算”、“风控校验”等横切能力封装为独立服务,通过组合注入(如 private RiskValidator riskValidator),比继承更易替换和测试
- 若某业务线需同时具备订单+物流属性,优先考虑组合(OrderAsset 包含 LogisticsInfo 对象),而非强行拉通继承链
这样设计出来的核心资产实体,既保证了主干稳定,又留足了业务定制余地,上线后新增一个业务线,往往只需写一个新子类加几行字段声明。


















