From 093ca0a687ad6c69157f07e2dc4ec4ce54043859 Mon Sep 17 00:00:00 2001 From: igor-suhorukov Date: Thu, 25 Jan 2018 01:56:23 +0300 Subject: [PATCH] Use EnumMap whenever possible Replace regular Map instances with EnumMap to reduce memory consumption. Closes gh-11760 --- .../DiscoveredOperationsFactory.java | 5 +++-- .../cache/CacheConfigurations.java | 6 +++--- .../jackson/JacksonProperties.java | 18 +++++++++++------- .../autoconfigure/jooq/SqlDialectLookup.java | 6 +++--- .../autoconfigure/orm/jpa/DatabaseLookup.java | 6 +++--- .../session/SessionStoreMappings.java | 10 ++++++---- .../error/DefaultErrorWebExceptionHandler.java | 4 ++-- .../error/DefaultErrorViewResolver.java | 6 +++--- .../remote/client/ClassPathChangeUploader.java | 7 ++++--- .../boot/configurationprocessor/TypeUtils.java | 3 ++- .../springframework/boot/ansi/AnsiColors.java | 6 +++--- .../boot/logging/AbstractLoggingSystem.java | 5 +++-- 12 files changed, 46 insertions(+), 36 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationsFactory.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationsFactory.java index f03407cfcc9..f65915ee9bd 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationsFactory.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationsFactory.java @@ -20,7 +20,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; -import java.util.LinkedHashMap; +import java.util.EnumMap; import java.util.Map; import java.util.Objects; @@ -50,7 +50,8 @@ abstract class DiscoveredOperationsFactory { private static final Map> OPERATION_TYPES; static { - Map> operationTypes = new LinkedHashMap<>(); + Map> operationTypes = new EnumMap<>( + OperationType.class); operationTypes.put(OperationType.READ, ReadOperation.class); operationTypes.put(OperationType.WRITE, WriteOperation.class); operationTypes.put(OperationType.DELETE, DeleteOperation.class); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheConfigurations.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheConfigurations.java index 0b57027cf59..22fce136ca6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheConfigurations.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/CacheConfigurations.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ package org.springframework.boot.autoconfigure.cache; import java.util.Collections; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Map; import org.springframework.util.Assert; @@ -33,7 +33,7 @@ final class CacheConfigurations { private static final Map> MAPPINGS; static { - Map> mappings = new HashMap<>(); + Map> mappings = new EnumMap<>(CacheType.class); mappings.put(CacheType.GENERIC, GenericCacheConfiguration.class); mappings.put(CacheType.EHCACHE, EhCacheCacheConfiguration.class); mappings.put(CacheType.HAZELCAST, HazelcastCacheConfiguration.class); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonProperties.java index e4f8f0e53d9..071a270aa7d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,7 @@ package org.springframework.boot.autoconfigure.jackson; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Locale; import java.util.Map; import java.util.TimeZone; @@ -63,27 +63,31 @@ public class JacksonProperties { /** * Jackson on/off features that affect the way Java objects are serialized. */ - private Map serialization = new HashMap<>(); + private Map serialization = new EnumMap<>( + SerializationFeature.class); /** * Jackson on/off features that affect the way Java objects are deserialized. */ - private Map deserialization = new HashMap<>(); + private Map deserialization = new EnumMap<>( + DeserializationFeature.class); /** * Jackson general purpose on/off features. */ - private Map mapper = new HashMap<>(); + private Map mapper = new EnumMap<>(MapperFeature.class); /** * Jackson on/off features for parsers. */ - private Map parser = new HashMap<>(); + private Map parser = new EnumMap<>( + JsonParser.Feature.class); /** * Jackson on/off features for generators. */ - private Map generator = new HashMap<>(); + private Map generator = new EnumMap<>( + JsonGenerator.Feature.class); /** * Controls the inclusion of properties during serialization. Configured with one of diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/SqlDialectLookup.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/SqlDialectLookup.java index 400365bc518..5a4b875a07f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/SqlDialectLookup.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/SqlDialectLookup.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ package org.springframework.boot.autoconfigure.jooq; import java.util.Collections; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Map; import javax.sql.DataSource; @@ -42,7 +42,7 @@ final class SqlDialectLookup { private static final Map LOOKUP; static { - Map map = new HashMap<>(); + Map map = new EnumMap<>(DatabaseDriver.class); map.put(DatabaseDriver.DERBY, SQLDialect.DERBY); map.put(DatabaseDriver.H2, SQLDialect.H2); map.put(DatabaseDriver.HSQLDB, SQLDialect.HSQLDB); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DatabaseLookup.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DatabaseLookup.java index da593f89167..e31b7946d38 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DatabaseLookup.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DatabaseLookup.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ package org.springframework.boot.autoconfigure.orm.jpa; import java.util.Collections; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Map; import javax.sql.DataSource; @@ -43,7 +43,7 @@ final class DatabaseLookup { private static final Map LOOKUP; static { - Map map = new HashMap<>(); + Map map = new EnumMap<>(DatabaseDriver.class); map.put(DatabaseDriver.DERBY, Database.DERBY); map.put(DatabaseDriver.H2, Database.H2); map.put(DatabaseDriver.HSQLDB, Database.HSQL); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java index 912a2a1bbde..a6c93be19ee 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ package org.springframework.boot.autoconfigure.session; import java.util.Collections; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Map; import org.springframework.boot.WebApplicationType; @@ -34,7 +34,8 @@ final class SessionStoreMappings { private static final Map>> MAPPINGS; static { - Map>> mappings = new HashMap<>(); + Map>> mappings = new EnumMap<>( + StoreType.class); mappings.put(StoreType.REDIS, createMapping(RedisSessionConfiguration.class, RedisReactiveSessionConfiguration.class)); mappings.put(StoreType.MONGODB, createMapping(MongoSessionConfiguration.class, @@ -54,7 +55,8 @@ final class SessionStoreMappings { static Map> createMapping(Class servletConfiguration, Class reactiveConfiguration) { - Map> mapping = new HashMap<>(); + Map> mapping = new EnumMap<>( + WebApplicationType.class); mapping.put(WebApplicationType.SERVLET, servletConfiguration); if (reactiveConfiguration != null) { mapping.put(WebApplicationType.REACTIVE, reactiveConfiguration); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/error/DefaultErrorWebExceptionHandler.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/error/DefaultErrorWebExceptionHandler.java index 4c4674b6b7c..160e241bd6e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/error/DefaultErrorWebExceptionHandler.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/error/DefaultErrorWebExceptionHandler.java @@ -17,7 +17,7 @@ package org.springframework.boot.autoconfigure.web.reactive.error; import java.util.Collections; -import java.util.HashMap; +import java.util.EnumMap; import java.util.List; import java.util.Map; @@ -79,7 +79,7 @@ public class DefaultErrorWebExceptionHandler extends AbstractErrorWebExceptionHa .getLog(DefaultErrorWebExceptionHandler.class); static { - Map views = new HashMap<>(); + Map views = new EnumMap<>(HttpStatus.Series.class); views.put(HttpStatus.Series.CLIENT_ERROR, "4xx"); views.put(HttpStatus.Series.SERVER_ERROR, "5xx"); SERIES_VIEWS = Collections.unmodifiableMap(views); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/error/DefaultErrorViewResolver.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/error/DefaultErrorViewResolver.java index 40aa178058a..829c13c6372 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/error/DefaultErrorViewResolver.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/error/DefaultErrorViewResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ package org.springframework.boot.autoconfigure.web.servlet.error; import java.util.Collections; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; @@ -60,7 +60,7 @@ public class DefaultErrorViewResolver implements ErrorViewResolver, Ordered { private static final Map SERIES_VIEWS; static { - Map views = new HashMap<>(); + Map views = new EnumMap<>(Series.class); views.put(Series.CLIENT_ERROR, "4xx"); views.put(Series.SERVER_ERROR, "5xx"); SERIES_VIEWS = Collections.unmodifiableMap(views); diff --git a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/remote/client/ClassPathChangeUploader.java b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/remote/client/ClassPathChangeUploader.java index 5bf05c841c7..6e626cb36a1 100644 --- a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/remote/client/ClassPathChangeUploader.java +++ b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/remote/client/ClassPathChangeUploader.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,7 +25,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Collections; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Map; import org.apache.commons.logging.Log; @@ -61,7 +61,8 @@ public class ClassPathChangeUploader private static final Map TYPE_MAPPINGS; static { - Map map = new HashMap<>(); + Map map = new EnumMap<>( + ChangedFile.Type.class); map.put(ChangedFile.Type.ADD, ClassLoaderFile.Kind.ADDED); map.put(ChangedFile.Type.DELETE, ClassLoaderFile.Kind.DELETED); map.put(ChangedFile.Type.MODIFY, ClassLoaderFile.Kind.MODIFIED); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java index 2927abb2a20..cb354630349 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java @@ -18,6 +18,7 @@ package org.springframework.boot.configurationprocessor; import java.util.Collection; import java.util.Collections; +import java.util.EnumMap; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; @@ -45,7 +46,7 @@ class TypeUtils { private static final Map> PRIMITIVE_WRAPPERS; static { - Map> wrappers = new HashMap<>(); + Map> wrappers = new EnumMap<>(TypeKind.class); wrappers.put(TypeKind.BOOLEAN, Boolean.class); wrappers.put(TypeKind.BYTE, Byte.class); wrappers.put(TypeKind.CHAR, Character.class); diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ansi/AnsiColors.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ansi/AnsiColors.java index b7dabb39171..d831e9dab17 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ansi/AnsiColors.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ansi/AnsiColors.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,7 @@ package org.springframework.boot.ansi; import java.awt.Color; import java.awt.color.ColorSpace; import java.util.Collections; -import java.util.LinkedHashMap; +import java.util.EnumMap; import java.util.Map; import java.util.Map.Entry; @@ -39,7 +39,7 @@ public final class AnsiColors { private static final Map ANSI_COLOR_MAP; static { - Map colorMap = new LinkedHashMap<>(); + Map colorMap = new EnumMap<>(AnsiColor.class); colorMap.put(AnsiColor.BLACK, new LabColor(0x000000)); colorMap.put(AnsiColor.RED, new LabColor(0xAA0000)); colorMap.put(AnsiColor.GREEN, new LabColor(0x00AA00)); diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/AbstractLoggingSystem.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/AbstractLoggingSystem.java index 43614b98c9f..422baab6ac1 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/AbstractLoggingSystem.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/AbstractLoggingSystem.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2017 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.springframework.boot.logging; import java.util.Comparator; +import java.util.EnumMap; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Map; @@ -194,7 +195,7 @@ public abstract class AbstractLoggingSystem extends LoggingSystem { private final Map nativeToSystem; public LogLevels() { - this.systemToNative = new HashMap<>(); + this.systemToNative = new EnumMap<>(LogLevel.class); this.nativeToSystem = new HashMap<>(); }