Skip to content

Commit 1a1c4bf

Browse files
committed
Merge pull request #141 from mperry/issue108
Attempt to fix P1.memo cache issue #108
2 parents b148dec + b07073d commit 1a1c4bf

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

core/src/main/java/fj/P1.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import fj.data.Option;
1010
import fj.data.Validation;
1111
//import fj.data.*;
12-
import fj.function.Try0;
12+
1313

1414
public abstract class P1<A> implements F0<A> {
1515

@@ -216,22 +216,28 @@ public P1<A> memo() {
216216
final P1<A> self = this;
217217
return new P1<A>() {
218218
private final Object latch = new Object();
219-
@SuppressWarnings({"InstanceVariableMayNotBeInitialized"})
220-
private volatile SoftReference<A> v;
219+
private volatile SoftReference<Option<A>> v = null;
221220

221+
@Override
222222
public A _1() {
223-
A a = v != null ? v.get() : null;
224-
if (a == null)
223+
Option<A> o = v != null ? v.get() : null;
224+
if (o == null) {
225225
synchronized (latch) {
226-
if (v == null || v.get() == null) {
227-
a = self._1();
228-
v = new SoftReference<A>(a);
229-
} else {
230-
a = v.get();
226+
o = v != null ? v.get() : null;
227+
if (o == null) {
228+
o = Option.some(self._1());
229+
v = new SoftReference<>(o);
231230
}
232231
}
233-
return a;
232+
}
233+
return o.some();
234+
}
235+
236+
@Override
237+
public P1<A> memo() {
238+
return this;
234239
}
240+
235241
};
236242
}
237243

0 commit comments

Comments
 (0)