Java8에서는 @FuncionalInterface 어노테이션을 가진 다양한 함수형 인터페이스를 제공한다.
이중 Suppllier[T] 함수형 인터페이스에 대해 알아보도록 하자
Supplier[T] 인터페이스는 T get() 이라는 메소드 하나만 추상화 되어있다.
ex) Supplier 인터페이스를 사용한 예시
// given
Supplier<User> supplier = () -> User.of(“사용자 아이디”,”사용자 이름”);
// when
User user = supplier.get();
// then
assertEquals(user.getId(), “사용자 아이디”);
assertEquals(user.getName(), “사용자 이름”);
위 코드를 얼핏 보면
// when
User user = User.of(“사용자 아이디”,”사용자 이름”);
// then
assertEquals(user.getId(), “사용자 아이디”);
assertEquals(user.getName(), “사용자 이름”);
위 코드와 크게 차이가 없어보인다.
하지만 Supplier 함수형 인터페이스를 사용함으로써 얻을 수 있는 큰 장점이 있다.
첫번째 장점
[T의 하위 타입 인스턴스를 반환할 수 있다.]
public class AdminUser extends User {
…
…
}
.... test
// given
Supplier<User> supplier = () -> AdminUser.of(“관리자 아이디”,”관리자 이름”);
// when
User user = supplier.get();
// then
assertTrue(user instanceOf AdminUser);
assertEquals(user.getId(), “관리자 아이디”);
assertEquals(user.getName(), “관리자 이름”);
두번째 장점 (예시가 적절하진 않지만… 이런식으로 코드 구성이 가능하다는 점에서…)
[Lazy initialize(지연 초기화)가 가능하다는 점이다.]
아래 Supplier를 사용하지 않았을 경우 User 인스턴스를 미리 초기화
시킨 후 메소드를 수행시켜야하지만,
Supplier를 통해 validation 후 User 인스턴스를 지연 초기화 시킬 수 있다.
public class UserService {
public void save(boolean canSave, Supplier<User> supplier){
if(canSave){
User user = supplier.get();
…
return;
}
throw ….
}
}