diff --git a/gson/src/main/java/com/google/gson/internal/bind/EnumTypeAdapter.java b/gson/src/main/java/com/google/gson/internal/bind/EnumTypeAdapter.java index 5f24dc18d9..a9b71becc6 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/EnumTypeAdapter.java +++ b/gson/src/main/java/com/google/gson/internal/bind/EnumTypeAdapter.java @@ -50,9 +50,9 @@ public TypeAdapter create(Gson gson, TypeToken typeToken) { } }; - private final Map nameToConstant = new HashMap<>(); - private final Map stringToConstant = new HashMap<>(); - private final Map constantToName = new HashMap<>(); + private final Map nameToConstant; + private final Map stringToConstant; + private final Map constantToName; private EnumTypeAdapter(Class classOfT) { try { @@ -69,7 +69,12 @@ private EnumTypeAdapter(Class classOfT) { // Trim the array to the new length. Every enum type can be expected to have at least // one declared field which is not an enum constant, namely the implicit $VALUES array - fields = Arrays.copyOf(fields, constantCount); + fields = (constantCount == fields.length) ? fields : Arrays.copyOf(fields, constantCount); + + nameToConstant = new HashMap<>(constantCount, 1F); + stringToConstant = new HashMap<>(constantCount, 1F); + // Don't use `EnumMap` here; that can break when using ProGuard or R8 + constantToName = new HashMap<>(constantCount, 1F); AccessibleObject.setAccessible(fields, true);