这里使用 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;
    }
}
相关推荐
@小码农8 小时前
2025年北京海淀区中小学生信息学竞赛第二赛段C++真题
开发语言·数据结构·c++·算法
sulikey8 小时前
C++模板初阶详解:从函数模板到类模板的全面解析
开发语言·c++·模板·函数模板·类模板
careathers8 小时前
【JavaSE语法】面向对象初步认识
java·面向对象
coding随想8 小时前
掌控选区的终极武器:getSelection API的深度解析与实战应用
java·前端·javascript
嵌入式小能手8 小时前
飞凌嵌入式ElfBoard-文件I/O的深入学习之存储映射I/O
java·前端·学习
0 0 08 小时前
CCF-CSP第39次认证第三题——HTTP 头信息(HPACK)【C++】
开发语言·c++·算法
沐风。569 小时前
Object方法
开发语言·前端·javascript
IT_阿水9 小时前
C语言之printf函数用法
c语言·开发语言·printf
ChinaRainbowSea9 小时前
github 仓库主页美化定制
java·后端·github