Android深拷贝

2019-11-21  本文已影响0人  移动端_小刚哥

我要连续调用三个接口,给每一个接口都传一个字典作为参数,这个字典包括基础的参数,在每一个接口里边又有自己的参数:

    /*封装参数*/
    void createParaDic(){
        HashMap<String,Object> paraDic = new HashMap<>();
        paraDic.put("para1","para1");
        paraDic.put("para2","para2");
        paraDic.put("para3","para3");
        
        requestA(paraDic);
        requestB(paraDic);
        requestC(paraDic);
    }

    /*网络请求A*/
    void requestA(HashMap<String,Object> paraDic){
        paraDic.put("para3","A");
        //开始网络请求
    }

    /*网络请求B*/
    void requestB(HashMap<String,Object> paraDic){
        paraDic.put("para3","B");
        //开始网络请求
    }

    /*网络请求C*/
    void requestC(HashMap<String,Object> paraDic){
        paraDic.put("para3","C");
        //开始网络请求
    }

这个时候虽然网络请求成功不受影响,但是如果想在网络请求成功之后打印出来参数和返回值,那么方法A、B、C打印出来的参数都是

para3 = C

这会对我们分析日志造成误导,那么我们在给每一个方法传值时都是用深拷贝就可以解决这个问题了,深拷贝代码如下

    /**
     * 对象深度复制(对象必须是实现了Serializable接口)
     *
     * @param obj
     * @return T
     * @author Muscleape
     * @date 2018/8/10 14:39
     */
    @SuppressWarnings("unchecked")
    public static <T extends Serializable> T customerClone(T obj) {
        T clonedObj = null;
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(obj);
            oos.close();

            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            clonedObj = (T) ois.readObject();
            ois.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return clonedObj;
    }

我们的实现方法改成如下:

    /*封装参数*/
    void createParaDic(){
        HashMap<String,Object> paraDic = new HashMap<>();
        paraDic.put("para1","para1");
        paraDic.put("para2","para2");
        paraDic.put("para3","para3");

        HashMap<String,Object> paraA = Utils.customerClone(paraDic);
        requestA(paraA);

        HashMap<String,Object> paraB = Utils.customerClone(paraDic);
        requestB(paraB);

        HashMap<String,Object> paraC = Utils.customerClone(paraDic);
        requestC(paraC);
    }

    /*网络请求A*/
    void requestA(HashMap<String,Object> paraDic){
        paraDic.put("para3","A");
        //开始网络请求
    }
    /*网络请求B*/
    void requestB(HashMap<String,Object> paraDic){
        paraDic.put("para3","B");
        //开始网络请求
    }
    /*网络请求C*/
    void requestC(HashMap<String,Object> paraDic){
        paraDic.put("para3","C");
        //开始网络请求
    }

⚠️如果参数中有我们自己定义的对象,那么这个对象必须是实现了Serializable接口

参考文章
https://www.jianshu.com/p/eb2113e12ecb

上一篇下一篇

猜你喜欢

热点阅读