当前位置: 首页 > news >正文

JSON结构的 泛型和 **非泛型两种 Java 实体类实现方案

以下是针对该 JSON 结构的 泛型非泛型 两种 Java 实体类实现方案,并分析它们的区别和适用场景:


方案 1:使用泛型(推荐)

特点:灵活复用,适合统一响应结构

import lombok.Data;
import java.time.OffsetDateTime;
import java.util.List;// 1. 基础响应泛型类
@Data
public class ApiResponse<T> {private Boolean success;private String code;private String message;private T result; // 泛型接收不同数据类型
}// 2. 分页结果泛型类
@Data
public class PageResult<T> {private List<T> records;private Integer total;private Integer size;private Integer current;private List<Object> orders;private Boolean optimizeCountSql;private Boolean hitCount;private Boolean searchCount;private Integer pages;
}// 3. 具体数据实体
@Data
public class ConferenceRoom {private Long conferenceId;private String conferenceName;private String conferenceNumber;private OffsetDateTime createDate;// 其他字段...
}// 使用示例
ApiResponse<PageResult<ConferenceRoom>> response = objectMapper.readValue(json, new TypeReference<ApiResponse<PageResult<ConferenceRoom>>>() {});

方案 2:非泛型(直接定义)

特点:直观简单,适合固定结构

import lombok.Data;
import java.time.OffsetDateTime;
import java.util.List;// 1. 完整响应实体(无泛型)
@Data
public class ConferenceApiResponse {private Boolean success;private String code;private String message;private ConferenceResult result;
}// 2. 分页结果实体
@Data
public class ConferenceResult {private List<ConferenceRoom> records;private Integer total;private Integer size;private Integer current;private List<Object> orders;private Boolean optimizeCountSql;private Boolean hitCount;private Boolean searchCount;private Integer pages;
}// 3. 会议室实体(同方案1)
@Data
public class ConferenceRoom {private Long conferenceId;private String conferenceName;// 其他字段...
}// 使用示例
ConferenceApiResponse response = objectMapper.readValue(json, ConferenceApiResponse.class);

核心区别对比

对比维度泛型实现非泛型实现
代码复用性✅ 一套结构适配所有接口❌ 每套数据结构需单独定义类
可维护性修改基类即可影响所有接口需逐个修改相似结构的类
类型安全编译时检查类型匹配需手动保证字段一致性
JSON解析复杂度需使用TypeReference处理嵌套泛型直接解析,无需处理泛型擦除
适用场景多接口统一响应格式的系统接口结构固定且简单的场景
扩展性轻松支持新数据类型新增数据类型需定义新类

如何选择?

  1. 选泛型 当:

    • 项目有统一的响应格式标准(如success/code/message/result
    • 需要处理多种数据类型(如分页的用户、订单、会议室等)
    • 预期未来会新增大量相似结构的接口
  2. 选非泛型 当:

    • 接口结构完全固定且不会扩展
    • 对泛型理解不深,追求简单实现
    • 需要快速原型开发(减少泛型带来的初始复杂度)

注意事项

  1. 泛型的局限性

    • 运行时类型擦除:List<ConferenceRoom> 在运行时变为 List,需通过TypeReference保留类型信息
    // 必须这样解析泛型
    mapper.readValue(json, new TypeReference<ApiResponse<PageResult<ConferenceRoom>>>() {});
    
  2. 非泛型的冗余

    • 如果系统有20个分页接口,需要定义20个XxxApiResponseXxxResult
  3. 折中方案

    • 对少量特殊接口用非泛型,大部分统一接口用泛型
http://www.dtcms.com/a/320910.html

相关文章:

  • 【DFS系列 | 递归】DFS算法入门:递归原理与实现详解
  • Electron——窗口
  • 工具分享05 | Python制作PDF合并拆分提取工具V1.0
  • Linux 学习 ------Linux 入门(上)
  • trae开发c#
  • Android 中 实现自定义 Dialog 提示框
  • @CacheConfig​​当前类中所有缓存方法详解
  • Go语言实战案例:简易JSON数据返回
  • Linux多线程——生产者消费者模型
  • 芯科科技成为全球首家通过PSA 4级认证的物联网芯片厂商巩固其在物联网安全领域的领导地位
  • 从零开始构建【顺序表】:C语言实现与项目实战准备
  • 《汇编语言:基于X86处理器》第12章 浮点数处理与指令编码(2)
  • 【JavaEE】(10) JavaEE 简介
  • 虚幻基础:场景actor与角色的碰撞
  • 走进Linux世界:make和makefile
  • 深入浅出线程池ThreadPoolExecutor
  • 机器人焊机智能流量调节
  • SwiftUI中的键盘快捷键、初始页面控制及网络权限管理解析
  • linux-LVM 逻辑卷管理
  • Windows域控制器部署最佳实践
  • (1-9-1) Maven 特性、安装、配置、打包
  • 安全扫描:检测到目标站点存在javascript框架库漏洞问题(vue)
  • DQL 超维分析 - 5 集算器 DQL
  • 【网络】TCP/UDP协议
  • 通过上下文工程优化LangChain AI Agents(二)
  • 佳维视高亮度工业显示器,强光环境清晰可见
  • 从深度伪造到深度信任:AI安全的三场攻防战
  • 饿了么零售 sign 分析
  • WPF 动画卡顿
  • 技术速递|GPT-5 正式上线 Azure AI Foundry