这里使用 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;
    }
}
相关推荐
希望永不加班10 分钟前
SpringBoot 集成测试:@SpringBootTest 与 MockMvc
java·spring boot·后端·log4j·集成测试
enAn_14 分钟前
对照片和视频文件名,程序追加日期,直观看
java·maven
十五年专注C++开发20 分钟前
Oat++: 一个轻量级、高性能、零依赖的 C++ Web 框架
开发语言·c++·web服务·oatpp
yaaakaaang21 分钟前
六、适配器模式
java·适配器模式
陈天伟教授21 分钟前
心电心音同步分析-案例:原型设计一
开发语言·人工智能·python·语言模型·架构
Allen_LVyingbo24 分钟前
量子计算Dirac Notation基本教学—从零基础到读懂量子信息论文(下)
开发语言·人工智能·python·数学建模·量子计算
bobasyu27 分钟前
Claude Code 源码笔记 -- queryLoop
java·笔记·spring
wjs202432 分钟前
Ruby File 类和方法
开发语言
xyq202435 分钟前
API 类别 - UI 核心
开发语言
计算机学姐39 分钟前
基于SpringBoot的高校竞赛管理系统
java·spring boot·后端·spring·信息可视化·tomcat·mybatis