From d0c685f6b82959bc3abad5bea696750a28d3436e Mon Sep 17 00:00:00 2001 From: Christian Schuster Date: Tue, 26 May 2015 23:33:29 +0200 Subject: [PATCH] #365 cache implementation --- .../java/org/mapstruct/ap/services/Services.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/processor/src/main/java/org/mapstruct/ap/services/Services.java b/processor/src/main/java/org/mapstruct/ap/services/Services.java index eaf8089be..bedfa0f7c 100644 --- a/processor/src/main/java/org/mapstruct/ap/services/Services.java +++ b/processor/src/main/java/org/mapstruct/ap/services/Services.java @@ -18,7 +18,9 @@ */ package org.mapstruct.ap.services; +import java.util.Map; import java.util.ServiceLoader; +import java.util.WeakHashMap; import org.mapstruct.spi.AccessorNamingStrategy; @@ -29,21 +31,28 @@ import org.mapstruct.spi.AccessorNamingStrategy; */ public class Services { + private static final Map, Object> CACHE = new WeakHashMap, Object>(); + private Services() { } /** * Obtain an implementation of {@link AccessorNamingStrategy}. If no specialized implementation is found using - * {@link ServiceLoader}, a JavaBeans-compliant default implementation is returned. + * {@link ServiceLoader}, a JavaBeans-compliant default implementation is returned. The result is cached across + * invocations. * * @return The implementation of {@link AccessorNamingStrategy}. * @throws IllegalStateException If more than one implementation is found by * {@link ServiceLoader#load(Class, ClassLoader)}. */ public static AccessorNamingStrategy getAccessorNamingStrategy() { - AccessorNamingStrategy impl = get( AccessorNamingStrategy.class ); + AccessorNamingStrategy impl = (AccessorNamingStrategy) CACHE.get( AccessorNamingStrategy.class ); if ( impl == null ) { - impl = new DefaultAccessorNamingStrategy(); + impl = get( AccessorNamingStrategy.class ); + if ( impl == null ) { + impl = new DefaultAccessorNamingStrategy(); + } + CACHE.put( AccessorNamingStrategy.class, impl ); } return impl; }