2015-07-24 11:32:22 +03:00
|
|
|
package com.iluwatar.lazy.loading;
|
2015-04-10 20:24:16 +03:00
|
|
|
|
|
|
|
import java.util.function.Supplier;
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
2015-11-01 21:29:13 -05:00
|
|
|
* This lazy loader is thread safe and more efficient than {@link HolderThreadSafe}. It utilizes
|
|
|
|
* Java 8 functional interface {@link Supplier<T>} as {@link Heavy} factory.
|
2015-04-10 20:24:16 +03:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
public class Java8Holder {
|
|
|
|
|
2015-11-01 21:29:13 -05:00
|
|
|
private Supplier<Heavy> heavy = () -> createAndCacheHeavy();
|
|
|
|
|
|
|
|
public Java8Holder() {
|
|
|
|
System.out.println("Java8Holder created");
|
|
|
|
}
|
|
|
|
|
|
|
|
public Heavy getHeavy() {
|
|
|
|
return heavy.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
private synchronized Heavy createAndCacheHeavy() {
|
|
|
|
class HeavyFactory implements Supplier<Heavy> {
|
|
|
|
private final Heavy heavyInstance = new Heavy();
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Heavy get() {
|
|
|
|
return heavyInstance;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!HeavyFactory.class.isInstance(heavy)) {
|
|
|
|
heavy = new HeavyFactory();
|
|
|
|
}
|
|
|
|
return heavy.get();
|
|
|
|
}
|
2015-04-10 20:24:16 +03:00
|
|
|
}
|