利用Map创建Copy Object

Posted BINGJJFLY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Map创建Copy Object相关的知识,希望对你有一定的参考价值。

定义上下文行为,要继承Map

package com.wjz.core;

import java.io.Serializable;
import java.util.Map;

public interface CustomSubjectContext extends Map<String, Object> {

    void setSessionId(Serializable sessionId);
    
    Serializable getSessionId();
    
    void setAuthenticated(Boolean authc);
    
    Boolean isAuthenticated();
}

定义MapContext上下文,定义备份Map,实现备份Map的存取等关乎map的行为,实现Map

package com.wjz.core;

import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.springframework.util.CollectionUtils;

public class CustomMapContext implements Map<String, Object>, Serializable {

    private static final long serialVersionUID = 6611136447999868186L;
    
    private final Map<String, Object> backingMap;
    
    public CustomMapContext() {
        backingMap = new HashMap<String, Object>();
    }
    
    public CustomMapContext(Map<String, Object> map) {
        this();
        if (!CollectionUtils.isEmpty(map)) {
            this.backingMap.putAll(map);
        }
    }

    @Override
    public int size() {
        return backingMap.size();
    }

    @Override
    public boolean isEmpty() {
        return backingMap.isEmpty();
    }

    @Override
    public boolean containsKey(Object key) {
        return backingMap.containsKey(key);
    }

    @Override
    public boolean containsValue(Object value) {
        return backingMap.containsValue(value);
    }

    @Override
    public Object get(Object key) {
        return backingMap.get(key);
    }

    @Override
    public Object put(String key, Object value) {
        return backingMap.put(key, value);
    }

    @Override
    public Object remove(Object key) {
        return backingMap.remove(key);
    }

    @Override
    public void putAll(Map<? extends String, ?> m) {
        backingMap.putAll(m);
    }

    @Override
    public void clear() {
        backingMap.clear();
    }

    @Override
    public Set<String> keySet() {
        return Collections.unmodifiableSet(backingMap.keySet());
    }

    @Override
    public Collection<Object> values() {
        return Collections.unmodifiableCollection(backingMap.values());
    }

    @Override
    public Set<Entry<String, Object>> entrySet() {
        return Collections.unmodifiableSet(backingMap.entrySet());
    }
    
    protected void nullSafePut(String key, Object value) {
        if (value != null) {
            put(key, value);
        }
    }
    
    @SuppressWarnings("unchecked")
    protected <E> E getTypeValue(String key, Class<E> type) {
        E val = null;
        Object result = backingMap.get(key);
        if (result != null) {
            if (!type.isAssignableFrom(result.getClass())) {
                // 类型不正确
            }
            val = (E) result;
        }
        return val;
    }

}

定义默认的上下文实现类,继承MapContext上下文,具体实现上下文

package com.wjz.core;

import java.io.Serializable;

public class DefaultCustomSubjectContext extends CustomMapContext implements CustomSubjectContext {

    private static final long serialVersionUID = -273450905542274017L;
    
    private static final String SESSION_ID = ".SESSION_ID";
    
    private static final String AUTHC = ".AUTHC";

    public DefaultCustomSubjectContext() {
        super();
    }
    
    public DefaultCustomSubjectContext(CustomSubjectContext sctx) {
        super(sctx);
    }
    
    @Override
    public void setSessionId(Serializable sessionId) {
        nullSafePut(SESSION_ID, sessionId);
    }

    @Override
    public Serializable getSessionId() {
        return getTypeValue(SESSION_ID, Serializable.class);
    }

    @Override
    public void setAuthenticated(Boolean authc) {
        nullSafePut(AUTHC, authc);
    }

    @Override
    public Boolean isAuthenticated() {
        return getTypeValue(AUTHC, Boolean.class);
    }

}

demo

package com.wjz.demo;

import com.wjz.core.CustomSubjectContext;
import com.wjz.core.DefaultCustomSubjectContext;

public class CopyDemo {

    public static void main(String[] args) {
        CustomSubjectContext sctx = new DefaultCustomSubjectContext();
        sctx.setSessionId("sctx 123456");
        sctx.setAuthenticated(true);
        System.out.println("sctx getSessionId :" + sctx.getSessionId());
        System.out.println("sctx isAuthenticated :" + sctx.isAuthenticated());
        System.out.println();
        CustomSubjectContext copy = new DefaultCustomSubjectContext(sctx);
        copy.setSessionId("copy 123456");
        System.out.println("copy getSessionId :" + copy.getSessionId());
        System.out.println("copy isAuthenticated :" + copy.isAuthenticated());
    }
}

 

以上是关于利用Map创建Copy Object的主要内容,如果未能解决你的问题,请参考以下文章

利用“Copy-on-Write”将数据复制到Multiprocessing.Pool()工作进程

将多个输出中的hls属性设置为单独的片段代码

Java Object对象之clone方法

Java Object对象之clone方法

Xcode 快速开发 代码块

JAVA中利用反射机制进行对象和Map相互转换的方法