利用Map創建Copy Object
阿新 • • 發佈:2018-05-28
AS oid over default obj odi contex sta str
定義上下文行為,要繼承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 implementsMap<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