cache

Details

diff --git a/src/main/java/br/ufrgs/inf/prosoft/cache/Cache.java b/src/main/java/br/ufrgs/inf/prosoft/cache/Cache.java
index 94c7fea..35c1aa9 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/cache/Cache.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/cache/Cache.java
@@ -5,7 +5,7 @@
  */
 package br.ufrgs.inf.prosoft.cache;
 
-import java.util.function.Function;
+import java.util.function.Supplier;
 
 /**
  *
@@ -23,23 +23,23 @@ public interface Cache<K, V> {
 
     public void invalidate(K key);
 
-    public default V computeIfAbsent(K key, Function<K, V> function, long timeToLive) {
+    public default V computeIfAbsent(K key, Supplier<V> supplier, long timeToLive) {
         V get = get(key);
         if (get != null) {
             return get;
         }
-        V apply = function.apply(key);
-        put(key, apply, timeToLive);
-        return apply;
+        get = supplier.get();
+        put(key, get, timeToLive);
+        return get;
     }
 
-    public default V computeIfAbsent(K key, Function<K, V> function) {
+    public default V computeIfAbsent(K key, Supplier<V> supplier) {
         V get = get(key);
         if (get != null) {
             return get;
         }
-        V apply = function.apply(key);
-        put(key, apply);
-        return apply;
+        get = supplier.get();
+        put(key, get);
+        return get;
     }
 }
diff --git a/src/main/java/br/ufrgs/inf/prosoft/cache/GetterCache.java b/src/main/java/br/ufrgs/inf/prosoft/cache/GetterCache.java
index c9936b5..997985e 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/cache/GetterCache.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/cache/GetterCache.java
@@ -5,6 +5,7 @@
  */
 package br.ufrgs.inf.prosoft.cache;
 
+import java.util.function.Supplier;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -72,4 +73,23 @@ public class GetterCache<V> {
         this.cachingPerformance.registerInvalidation();
     }
 
+    public V computeIfAbsent(Supplier<V> supplier, long timeToLive) {
+        V get = get();
+        if (get != null) {
+            return get;
+        }
+        get = supplier.get();
+        put(get, timeToLive);
+        return get;
+    }
+
+    public V computeIfAbsent(Supplier<V> supplier) {
+        V get = get();
+        if (get != null) {
+            return get;
+        }
+        get = supplier.get();
+        put(get);
+        return get;
+    }
 }