From f86529bbb92c74bbb99fa53779264158174e0d26 Mon Sep 17 00:00:00 2001 From: Antonio Alonzi Date: Mon, 30 Mar 2020 09:17:07 +0100 Subject: [PATCH] #6256: Do not create new Set/Map --- Mage/src/main/java/mage/watchers/Watcher.java | 6 ++-- Mage/src/test/java/mage/WatcherTest.java | 31 ++++++++++++++----- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Mage/src/main/java/mage/watchers/Watcher.java b/Mage/src/main/java/mage/watchers/Watcher.java index a3f050aa0d5..762514ec549 100644 --- a/Mage/src/main/java/mage/watchers/Watcher.java +++ b/Mage/src/main/java/mage/watchers/Watcher.java @@ -112,11 +112,11 @@ public abstract class Watcher implements Serializable { field.setAccessible(true); if (field.getType() == Set.class) { - field.set(watcher, new HashSet<>()); + ((Set) field.get(watcher)).clear(); ((Set) field.get(watcher)).addAll((Set) field.get(this)); } else if (field.getType() == Map.class) { - HashMap target = new HashMap<>(); - field.set(watcher, target); + Map target = ((Map) field.get(watcher)); + target.clear(); Map source = (Map) field.get(this); ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType(); diff --git a/Mage/src/test/java/mage/WatcherTest.java b/Mage/src/test/java/mage/WatcherTest.java index 45e50a84e34..8ad06fde915 100644 --- a/Mage/src/test/java/mage/WatcherTest.java +++ b/Mage/src/test/java/mage/WatcherTest.java @@ -4,9 +4,12 @@ import static mage.constants.WatcherScope.GAME; import static org.junit.Assert.assertEquals; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; +import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import mage.constants.WatcherScope; import mage.game.Game; import mage.game.events.GameEvent; @@ -18,24 +21,36 @@ public class WatcherTest { @Test public void test() { // Given + Map mapField = new HashMap<>(); + mapField.put("mapFieldKey1", "mapFieldValue1"); + mapField.put("mapFieldKey2", "mapFieldValue2"); + TestWatcher testWatcher = new TestWatcher(GAME); testWatcher.setStringField("stringField"); - testWatcher.setSetField(ImmutableSet.of("setField1, setField2")); - testWatcher.setMapField(ImmutableMap.of("mapFieldKey1, mapFieldValue1", "mapFieldKey2, mapFieldValue2")); + testWatcher.setSetField(set("setField1", "setField2")); + testWatcher.setMapField(mapField); // When TestWatcher copy = testWatcher.copy(); + // And + testWatcher.getSetField().add("setField3"); + mapField.put("mapFieldKey3", "mapFieldValue3"); + // Then - assertEquals(testWatcher.getStringField(), copy.getStringField()); - assertEquals(testWatcher.getSetField(), copy.getSetField()); - assertEquals(testWatcher.getMapField(), copy.getMapField()); + assertEquals("stringField", copy.getStringField()); + assertEquals(set("setField1", "setField2"), copy.getSetField()); + assertEquals(ImmutableMap.of("mapFieldKey1", "mapFieldValue1", "mapFieldKey2", "mapFieldValue2"), copy.getMapField()); + } + + private Set set(String... values) { + return Stream.of(values).collect(Collectors.toSet()); } public static class TestWatcher extends Watcher { private String stringField; - private Set setField; - private Map mapField; + private Set setField = new HashSet<>(); + private Map mapField = new HashMap<>(); public TestWatcher(WatcherScope scope) { super(scope);