美文网首页
Android深拷贝

Android深拷贝

作者: 移动端_小刚哥 | 来源:发表于2019-11-21 09:57 被阅读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

相关文章

  • Android深拷贝

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

  • 对象深拷贝和浅拷贝

    浅拷贝 深拷贝 深拷贝的递归方法 深拷贝的JSON方法

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • iOS基础知识点(网络摘抄)

    1.父类实现深拷贝时,子类如何实现深拷贝。父类没有实现深拷贝时,子类如何实现深拷贝? 深拷贝同浅拷贝的区别:...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • Android LayoutParams的深拷贝

    遇到的问题整理 对称布局提供了API直接在存在的LayoutParams对象上创建新实例,但是修改以后,原来的Vi...

  • Android DiffUtil 封装|深拷贝

    痛点以及问题 RecyclerView已经逐渐成为一个安卓开发写一个滑动布局必备的控件了,但是项目中用的大部分还是...

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

网友评论

      本文标题:Android深拷贝

      本文链接:https://www.haomeiwen.com/subject/spezictx.html