From e4b1609a2a8b5ac2d0b49a9d394f1d7343e54aa2 Mon Sep 17 00:00:00 2001 From: pantao Date: Sat, 4 Jan 2020 16:44:27 +0800 Subject: [PATCH] feat: given a map which have a default value --- .../{DefaultedMap.java => TolerantMap.java} | 46 +++++++++++++++---- .../cn/hutool/core/map/TolerantMapTest.java | 40 ++++++++++++++++ 2 files changed, 77 insertions(+), 9 deletions(-) rename hutool-core/src/main/java/cn/hutool/core/map/{DefaultedMap.java => TolerantMap.java} (70%) create mode 100644 hutool-core/src/test/java/cn/hutool/core/map/TolerantMapTest.java diff --git a/hutool-core/src/main/java/cn/hutool/core/map/DefaultedMap.java b/hutool-core/src/main/java/cn/hutool/core/map/TolerantMap.java similarity index 70% rename from hutool-core/src/main/java/cn/hutool/core/map/DefaultedMap.java rename to hutool-core/src/main/java/cn/hutool/core/map/TolerantMap.java index d8960c1d2..580f39599 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/DefaultedMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/TolerantMap.java @@ -1,5 +1,10 @@ package cn.hutool.core.map; +import cn.hutool.core.util.ObjectUtil; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.*; import java.util.function.BiConsumer; @@ -7,32 +12,40 @@ import java.util.function.BiFunction; import java.util.function.Function; /** + * 一个可以提供默认值的Map + * * @author pantao * @since 2020/1/3 */ -public class DefaultedMap extends AbstractMap implements Map, Cloneable, Serializable { +public class TolerantMap extends AbstractMap implements Map, Cloneable, Serializable { - private final Map map; + private static final long serialVersionUID = -4158133823263496197L; - private final V defaultValue; + private transient Map map; - public DefaultedMap(V defaultValue) { + private transient V defaultValue; + + public TolerantMap(V defaultValue) { this(new HashMap<>(), defaultValue); } - public DefaultedMap(int initialCapacity, float loadFactor, V defaultValue) { + public TolerantMap(int initialCapacity, float loadFactor, V defaultValue) { this(new HashMap<>(initialCapacity, loadFactor), defaultValue); } - public DefaultedMap(int initialCapacity, V defaultValue) { + public TolerantMap(int initialCapacity, V defaultValue) { this(new HashMap<>(initialCapacity), defaultValue); } - public DefaultedMap(Map map, V defaultValue) { + public TolerantMap(Map map, V defaultValue) { this.map = map; this.defaultValue = defaultValue; } + public static TolerantMap of(Map map, V defaultValue) { + return new TolerantMap<>(map, defaultValue); + } + @Override public int size() { return map.size(); @@ -159,7 +172,7 @@ public class DefaultedMap extends AbstractMap implements Map, if (!super.equals(o)) { return false; } - DefaultedMap that = (DefaultedMap) o; + TolerantMap that = (TolerantMap) o; return map.equals(that.map) && Objects.equals(defaultValue, that.defaultValue); } @@ -170,6 +183,21 @@ public class DefaultedMap extends AbstractMap implements Map, @Override public String toString() { - return "DefaultedMap{" + "map=" + map + ", defaultValue=" + defaultValue + '}'; + return "TolerantMap{" + "map=" + map + ", defaultValue=" + defaultValue + '}'; + } + + private void writeObject(ObjectOutputStream s) throws IOException { + s.writeObject(ObjectUtil.serialize(map)); + s.writeObject(ObjectUtil.serialize(defaultValue)); + } + + private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { + map = ObjectUtil.deserialize((byte[]) s.readObject()); + defaultValue = ObjectUtil.deserialize((byte[]) s.readObject()); + } + + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); } } diff --git a/hutool-core/src/test/java/cn/hutool/core/map/TolerantMapTest.java b/hutool-core/src/test/java/cn/hutool/core/map/TolerantMapTest.java new file mode 100644 index 000000000..dba466118 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/map/TolerantMapTest.java @@ -0,0 +1,40 @@ +package cn.hutool.core.map; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; + +public class TolerantMapTest { + + private final TolerantMap map = TolerantMap.of(new HashMap<>(), "default"); + + @Before + public void before() { + map.put("monday", "星期一"); + map.put("tuesday", "星期二"); + } + + @Test + public void testSerialize() { + byte[] bytes = ObjectUtil.serialize(map); + TolerantMap serializedMap = ObjectUtil.deserialize(bytes); + assert serializedMap != map; + assert map.equals(serializedMap); + } + + @Test + public void testClone() { + TolerantMap clonedMap = ObjectUtil.clone(map); + assert clonedMap != map; + assert map.equals(clonedMap); + } + + @Test + public void testGet() { + assert "星期二".equals(map.get("tuesday")); + assert "default".equals(map.get(RandomUtil.randomString(6))); + } +}