使用 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;
}
}