diff options
author | nea <romangraef@gmail.com> | 2022-12-19 23:10:16 +0100 |
---|---|---|
committer | nea <romangraef@gmail.com> | 2022-12-24 02:52:20 +0100 |
commit | 7f09cac0aa1451ef0e0c330f908cc279df323e17 (patch) | |
tree | c7c63c23d093560e3b808496d54b389cea4f0dbf /src/main/java | |
parent | 912654c092ad123febf9f22775d8569d85517646 (diff) | |
download | NotEnoughUpdates-7f09cac0aa1451ef0e0c330f908cc279df323e17.tar.gz NotEnoughUpdates-7f09cac0aa1451ef0e0c330f908cc279df323e17.tar.bz2 NotEnoughUpdates-7f09cac0aa1451ef0e0c330f908cc279df323e17.zip |
LRUCache: Cache null results
Diffstat (limited to 'src/main/java')
-rw-r--r-- | src/main/java/io/github/moulberry/notenoughupdates/util/LRUCache.java | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/LRUCache.java b/src/main/java/io/github/moulberry/notenoughupdates/util/LRUCache.java index f107d522..6adbc30d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/LRUCache.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/LRUCache.java @@ -32,13 +32,15 @@ public interface LRUCache<K, V> extends Function<K, V> { } static <K, V> LRUCache<K, V> memoize(Function<K, V> mapper, IntSupplier maxCacheSize) { - Map<K, V> cache = new LinkedHashMap<K, V>(10, 0.75F, true) { + Map<K, Object> cache = new LinkedHashMap<K, Object>(10, 0.75F, true) { @Override - protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { + protected boolean removeEldestEntry(Map.Entry<K, Object> eldest) { return this.size() > maxCacheSize.getAsInt(); } }; - Map<K, V> synchronizedCache = Collections.synchronizedMap(cache); + Object SENTINEL_CACHE_RESULT_NULL = new Object(); + Function<K, Object> sentinelAwareMapper = mapper.andThen(it -> it == null ? SENTINEL_CACHE_RESULT_NULL : it); + Map<K, Object> synchronizedCache = Collections.synchronizedMap(cache); return new LRUCache<K, V>() { @Override public void clearCache() { @@ -52,7 +54,8 @@ public interface LRUCache<K, V> extends Function<K, V> { @Override public V apply(K k) { - return synchronizedCache.computeIfAbsent(k, mapper); + Object value = synchronizedCache.computeIfAbsent(k, sentinelAwareMapper); + return value == SENTINEL_CACHE_RESULT_NULL ? null : (V) value; } }; } |