昨天在开发的时候突然想到的,有时候是需要对对象进行深度克隆.之前用了一些方法,例如实现每个变量的克隆方法,或者是将其转为序列化,然后再反序列化,这些方法都尝试过,但是昨天同样在对一个类实现深度克隆的时候,突然想到:该类是从后台接口返回的json格式数据,然后转为java对象的,也就是说,该对象的数据可以用对象来表示,也可以用json来表示,所以我没必要将该对象去实现Clone()方法啊,因为该对象里面的变量和内部类全都是由字符串,整型,浮点型组成的,直接用gson将该实例转为json,然后再用gson吧json转为对象不就行了.
经过测试,发现此方法确实可行,利用gson将对象生成json仅需一两行代码足以,而将json转换回原来的对象也只是一两行,这样工作就很轻松了,只需要完成这两个步骤就可以进行深度克隆了.不过也有局限性:只适用于由基本数据类型和String组成的格式,还有就是速度可能有点慢,因为需要json解析,结构复杂一点的话,生成json和解析json就比较耗时了
虽然有局限性,但是有时候也能带来不少便利,例如对后台返回的数据进行克隆的时候,用这种方法就轻松多了,不需要做任何多余的工作.
调用:
ProjectDataBean newProjectDataBean = CloneObjectUtil.cloneObjectFormJson(mProjectDataBean , ProjectDataBean.class);
工具类代码:
import com.google.gson.Gson; /** * 对象克隆工具类 */ public class CloneObjectUtil { /** * 通过json的方式来进行深度克隆 * * @param in * @param classT * @param <T> * @return */ public static <T> T cloneObjectFormJson(T in, Class<T> classT) { Gson gson = new Gson(); String json = gson.toJson(in); return gson.fromJson(json, classT); } }
适用的对象示例:
import java.util.List; /** * Created by Administrator on 2017/7/17. */ public class ProjectDataBean { /** * message : 数据请求成功 * extra : {"shopId":"1814","state":"1"} * success : true */ private String message; private ExtraBean extra; private DataBean data; private boolean success; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public ExtraBean getExtra() { return extra; } public void setExtra(ExtraBean extra) { this.extra = extra; } public DataBean getData() { return data; } public void setData(DataBean data) { this.data = data; } public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public static class ExtraBean { /** * shopId : 1814 * state : 1 */ private String shopId; private String state; public String getShopId() { return shopId; } public void setShopId(String shopId) { this.shopId = shopId; } public String getState() { return state; } public void setState(String state) { this.state = state; } } public static class DataBean { private List<DataMapBean> dataMap; public List<DataMapBean> getDataMap() { return dataMap; } public void setDataMap(List<DataMapBean> dataMap) { this.dataMap = dataMap; } public static class DataMapBean { /** * id : 2231 * name : 加氧射频美容仪 * coustype : 0 */ private int id; private String name; private int coustype; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getCoustype() { return coustype; } public void setCoustype(int coustype) { this.coustype = coustype; } } } }