-일반적으로는 객체가 Hilt Component에 바인딩이 되고 , 클라이언트가 Hilt Component에게 바인딩 된 의존성을 주입해달라고 요청을 하는 과정을 통해서 클래스가 의존성을 주입받게 된다.
-그렇다면
-Lazy 키워드를 사용하면 의존성이 주입되는 시기가 늦춰진다고 생각할 수 있지만 사실은 그렇지 않다. Lazy 키워드를 사용하여도 의존성이 주입되는 시기는 동일하다.
-하지만 실제 객체는 Hilt Component에 늦게 바인딩이 된다. 즉, Lazy는 의존성이 주입되는 시기를 조절하는 것이 아니라 , 객체 생성 시점을 지연시키고 요청이 있을 때 객체를 생성함으로서 의존성을 주입하는 과정을 의미한다.
-Lazy<>를 사용하면 객체의 초기화를 늦출 수 있고 내가 원하는 특정시점에 객체를 생성할 수 있다.
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
@Inject
lateinit var fooLazy : Lazy<Foo>
override fun onCreate(savedInstanceState : Bundle?) {
super.onCreate(savedInstanceState)
val foo1 = fooLazy.get()
}
}
-Lazy< T >의 get() 메서드를 호출할 때 T를 반환하며 , get() 메서드가 호출될 때 T가 인스턴스화 된다.
-Lazy< T >의 get() 메서드를 호출한 이후에 다시 get()을 호출하면 동일한 T 인스턴스를 얻는다. 즉, get()을 호출할 때마다 새로운 객체가 생성되는 것이 아니라는 것이다.
-T의 바인딩에 스코프가 지정되어 있다면 , 각 Lazy< T >의 요청에 대해서 동일한 Lazy< T > 인스턴스가 주입된다.
-특정 시점에 바인딩 인스턴스화를 할 때 사용하면 좋다.
-인스턴스 생성의 비용이 큰 경우에 사용하면 좋다.
-Lazy와 단 한가지 빼고 모두 동일하다.
-Lazy와 다른 차이점 한가지는 get 메서드를 통해 생성되는 객체가 모두 다 새로운 인스턴스라는 것이다. 그러나 get()을 사용했더라도 무조건 새로운 인스턴스가 반환되는 것은 아니다. 자세한 내용은 하단에 작성되어 있다.
-Provider< T >의 get() 메서드를 호출할 때마다 새로운 인스턴스 T를 반환한다.
-T의 바인딩에 스코프가 비정되어 있다면 , Provide< T >의 get() 메서드를 호출 할 때 동일한 인스턴스 T를 반환한다.
-T의 바인딩에 스코프가 비정되어 있다면 , 각각의 Provide< T > 요청에 대한 동일한 Provider< T > 인스턴스가 주입된다.
-하나의 Provider< T >로 여러 T 인스턴스를 생성하기 원할 때 사용 할 수 있다.