美文网首页
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深拷贝

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