@Test public void providerOfLazyOfSomething() { final AtomicInteger counter = new AtomicInteger(); class TestEntryPoint { @Inject Provider<Lazy<Integer>> providerOfLazyInteger; } @Module(entryPoints = TestEntryPoint.class) class TestModule { @Provides Integer provideInteger() { return counter.incrementAndGet(); } } TestEntryPoint ep = injectWithModule(new TestEntryPoint(), new TestModule()); assertEquals(0, counter.get()); Lazy<Integer> i = ep.providerOfLazyInteger.get(); assertEquals(1, i.get().intValue()); assertEquals(1, counter.get()); assertEquals(1, i.get().intValue()); Lazy<Integer> j = ep.providerOfLazyInteger.get(); assertEquals(2, j.get().intValue()); assertEquals(2, counter.get()); assertEquals(1, i.get().intValue()); }
@Override default Function1<T1, R> memoized() { if (isMemoized()) { return this; } else { final Lazy<R> forNull = Lazy.of(() -> apply(null)); final Object lock = new Object(); final Map<T1, R> cache = new HashMap<>(); return (Function1<T1, R> & Memoized) t1 -> { if (t1 == null) { return forNull.get(); } else { final R result; synchronized (lock) { result = cache.computeIfAbsent(t1, this::apply); } return result; } }; } }