JAVA/Java 8

Java8 람다식의 지연실행 (Lazy Programming)

위들 wedul 2018. 5. 31. 07:48

지연실행
-> 람다를 이용하면 필요할때만 호출해서 사용할  있는 Lazy Programming 구현   있다.

기존에 다음과 같이 사용하면 
당장 사용하지 않아도 실행이 되는 문제가 있었다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Heavy {
        Heavy() {
            System.out.println("Heavy created");
        }
    }
    
    Hodler 클래스
    Holder 클래스는 heavy 클래스를 포함하고 있다.
    public class Holder {
        public Holder() {
            System.out.println("Holder created");
        }
    
        Heavy heavy = new Heavy();
        public Heavy getHeavy() {
            return heavy;
        }
    }
    
    public static void main(String[] args) {
        Holder holder = new Holder();
        System.out.println("Get Heavy instance");
    }
cs



Holder 클래스를 선언   다음과 같은 순서로 실행된다.

==> 출력겨로가
Heavy created
Holder created
Get Heavy instance

Heavy 클래스를 가지고 있지만 당장 사용하지 않는데 Holder클래스가 생성될  먼저 생성되는 문제가 있다.
 
이런 문제를 람다식을 사용하여 필요할  호출하여 사용하는 Lazy 방식으로 변경   있다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Lazy<T> {
        private Optional<T> instance = Optional.empty();
        private Supplier<T> supplier;
        
        public Lazy(Supplier<T> theSupplier) {
            supplier = theSupplier;
        }
        
        public T get() {
            if(!instance.isPresent()) {
                instance = Optional.of(supplier.get());
            } 
            
            return instance.get();
        }
    }
cs



먼저 하나의 Lazy방식에 사용할 클래스를 선언한다.
그리고 Holder 클래스를 다음과 같이 변경한다.



1
2
3
4
5
6
7
8
9
10
public class Holder {
        public Holder() {
            System.out.println("Holder created");
        }
    
        Lazy<Heavy> heavy = new Lazy<Heavy> (() -> new Heavy());
        public Heavy getHeavy() {
            return heavy.get();
        }
}
cs



다시한번 실행해 보면

Heavy 클래스가 미리 생성되지 않는것을 확인 할 수 있다.


1
2
3
4
public static void main(String[] args) {
        Holder holder = new Holder();
        System.out.println("Get Heavy instance");
}
cs