Example #1
0
  @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());
  }
Example #2
0
 @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;
           }
         };
   }
 }