Kotlin에서는 생성자 내부 또는 클래스 본문 상단에서 클래스 속성을 초기화하지 않으려는 경우 기본적으로 언어 참조의 두 가지 옵션이 있습니다.
lazy ()는 람다를 가져오고 lazy 속성을 구현하기위한 대리자로 사용할 수있는 Lazy 인스턴스를 반환하는 함수입니다. get ()에 대한 첫 번째 호출은 lazy ()에 전달 된 람다를 실행하고 결과, 후속 호출을 기억합니다 get ()은 단순히 기억 된 결과를 반환합니다.
예
public class Hello { val myLazyString: String by lazy { "Hello" } }
이에, 어디든지 첫 번째 통화와 subquential 전화, 그래서 myLazyString 돌아갑니다 "안녕하세요"
일반적으로 null이 아닌 유형으로 선언 된 속성은 생성자에서 초기화해야합니다. 그러나 이것은 종종 편리하지 않습니다. 예를 들어, 속성은 의존성 주입을 통해 또는 단위 테스트의 설정 방법으로 초기화 될 수 있습니다. 이 경우 생성자에 null이 아닌 이니셜 라이저를 제공 할 수 없지만 클래스 본문 내에서 속성을 참조 할 때 null 검사를 피하려고합니다.
이 경우를 처리하기 위해 lateinit 수정자를 사용하여 특성을 표시 할 수 있습니다.
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }
수정자는 클래스 본문 내에 선언 된 var 속성 (기본 생성자는 아님) 및 속성에 사용자 지정 getter 또는 setter가없는 경우에만 사용할 수 있습니다. 특성의 유형은 널이 아니어야하며 기본 유형이 아니어야합니다.
따라서 두 옵션 모두에서 동일한 문제를 해결할 수 있기 때문에이 두 옵션 중에서 올바르게 선택하는 방법은 무엇입니까?
lateinit
Kotlin과 Java에서 속성에 액세스하는 방식이 다르므로 setter의 가시성으로 백업 필드 를 노출시킵니다. Java 코드에서이 속성은null
Kotlin에서 확인하지 않고도 설정할 수 있습니다 . 따라서lateinit
게으른 초기화가 아니라 Kotlin 코드의 초기화가 아닙니다.