package com.iluwatar.lazy.loading;

import java.util.function.Supplier;

/**
 * 
 * This lazy loader is thread safe and more efficient than HolderThreadSafe.
 * It utilizes Java 8 functional interface Supplier<T> as Heavy factory.
 *
 */
public class Java8Holder {
	
	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();
	}
}