这里使用 extends HashMap<String, Object> 和 类本身定义变量的优缺点

使用 extends HashMap<String, Object>的方式

java 复制代码
public class AjaxResult extends HashMap<String, Object> {
    private static final long serialVersionUID = 1L;
    
    public static final String CODE_TAG = "code";
    public static final String MSG_TAG = "msg";
    public static final String DATA_TAG = "data";
    
    public AjaxResult(int code, String msg) {
        put(CODE_TAG, code);
        put(MSG_TAG, msg);
    }
}

✅ 序列化/反序列化方便​ - JSON库可以直接处理

✅ Map操作简便​ - 可以直接使用所有Map方法

✅ 扩展性好​ - 可以随意添加字段

✅ 兼容性好​ - 可以被期望接收Map的API直接使用

缺点:

❌ 类型不安全​ - 可以put任意值

❌ 字段定义不明确​ - 没有编译时检查

❌ 难以重构​ - 字符串键容易写错

使用类定义变量的

方式

java 复制代码
public class AjaxResult {
    private int code;
    private String msg;
    private Object data;
    private Map<String, Object> extras; // 额外字段
    
    // 构造方法
    public AjaxResult(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    
    // Getter/Setter
    public int getCode() { return code; }
    public void setCode(int code) { this.code = code; }
    // ... 其他getter/setter
}

优点:

✅ 类型安全​ - 编译器检查类型

✅ IDE支持好​ - 自动补全、重构

✅ API明确​ - 字段和方法明确

✅ 可封装​ - 可以控制访问权限

缺点:

❌ 需要手动序列化​ - 需要额外的序列化配置

❌ 扩展性差​ - 不能动态添加字段

❌ 代码量大​ - 需要getter/setter

混合方式(推荐)

java 复制代码
/**
 * 使用组合而非继承,结合两者的优点
 */
public class AjaxResult {
    // 核心字段:类型安全
    private int code;
    private String msg;
    private Object data;
    
    // 额外字段:保持扩展性
    private Map<String, Object> extras = new HashMap<>();
    
    public AjaxResult(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    
    public AjaxResult(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    
    // 核心字段的getter/setter
    public int getCode() { return code; }
    public void setCode(int code) { this.code = code; }
    
    public String getMsg() { return msg; }
    public void setMsg(String msg) { this.msg = msg; }
    
    public Object getData() { return data; }
    public void setData(Object data) { this.data = data; }
    
    // 扩展字段操作方法
    public void putExtra(String key, Object value) {
        extras.put(key, value);
    }
    
    public Object getExtra(String key) {
        return extras.get(key);
    }
    
    public Map<String, Object> getExtras() {
        return new HashMap<>(extras);
    }
    
    // 转换为Map(用于序列化)
    public Map<String, Object> toMap() {
        Map<String, Object> map = new HashMap<>();
        map.put("code", code);
        map.put("msg", msg);
        if (data != null) {
            map.put("data", data);
        }
        map.putAll(extras);
        return map;
    }
    
    // 从Map创建(用于反序列化)
    public static AjaxResult fromMap(Map<String, Object> map) {
        AjaxResult result = new AjaxResult(
            (int) map.getOrDefault("code", 200),
            (String) map.getOrDefault("msg", "")
        );
        result.setData(map.get("data"));
        
        // 移除核心字段,剩下的作为扩展字段
        Map<String, Object> remaining = new HashMap<>(map);
        remaining.remove("code");
        remaining.remove("msg");
        remaining.remove("data");
        result.extras.putAll(remaining);
        
        return result;
    }
}

使用Lombok简化

java 复制代码
import lombok.Data;
import lombok.NoArgsConstructor;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.HashMap;
import java.util.Map;

@Data
@NoArgsConstructor
public class AjaxResult {
    private int code = 200;
    private String msg = "success";
    private Object data;
    
    // 动态字段
    @JsonIgnore
    private Map<String, Object> dynamicFields = new HashMap<>();
    
    public AjaxResult(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    
    public AjaxResult(int code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    
    // JSON序列化时包含动态字段
    @JsonAnyGetter
    public Map<String, Object> getDynamicFields() {
        return dynamicFields;
    }
    
    // JSON反序列化时接收未知字段
    @JsonAnySetter
    public void setDynamicField(String key, Object value) {
        dynamicFields.put(key, value);
    }
    
    // 链式调用
    public AjaxResult code(int code) {
        this.code = code;
        return this;
    }
    
    public AjaxResult msg(String msg) {
        this.msg = msg;
        return this;
    }
    
    public AjaxResult data(Object data) {
        this.data = data;
        return this;
    }
    
    public AjaxResult put(String key, Object value) {
        dynamicFields.put(key, value);
        return this;
    }
}
相关推荐
Suxing9几秒前
C语言基础分享:从“租房”到“拆迁”,C语言动态内存管理
java·数据结构·算法
减瓦2 分钟前
别让 Java 版本选择变成生产事故
java
ikun_文2 分钟前
Java集合框架Collection拓展进阶
java·java ee
SomeB1oody11 分钟前
【RustyML入门】3.8. 正则化与归一化层
开发语言·后端·机器学习·rust·教程
__zRainy__15 分钟前
Node系列 · Node基础:全局变量与全局对象
开发语言·前端·javascript
码匠许师傅16 分钟前
【C++ 面试真题】聊聊 C++ 的虚函数和多态
java·c++·面试
chuan.bai43 分钟前
Java RAG 实战(第 8 篇):Spring Boot RAG 查询 API
java·spring boot·贪心算法
FlyWIHTSKY43 分钟前
idea中集成claude功能
java·ide·人工智能·intellij-idea·cloudera
Java成神之路-1 小时前
Spring AI 统一结构化返回:ChatModel / ChatClient 两种实现方式
java·springaialibaba
鬼手点金1 小时前
Scrapy + Playwright 完整示例(JS 动态渲染网页)
开发语言·javascript·爬虫·python·scrapy·html·json