#kotlin-lateinit
#kotlin-lateinit
Вопрос:
В документе показан пример для проверки, был ли инициализирован lateinit var:
println("isInitialized before assignment: " this::lateinitVar.isInitialized)
lateinitVar = "value"
println("isInitialized after assignment: " this::lateinitVar.isInitialized)
Почему он должен использовать «this::» в качестве своего квалификатора
Ответ №1:
Ответ содержится в декомпилированном байт-коде. При вызове lateinitVar
вы получаете доступ к полю с проверкой инициализации:
println("logProperty: " lateinitVar)
компилируется для:
StringBuilder var10000 = (new StringBuilder()).append("logProperty: ");
String var10001 = this.lateinitVar;
if (this.lateinitVar == null) {
Intrinsics.throwUninitializedPropertyAccessException("lateinitVar");
}
String var1 = var10000.append(var10001).toString();
System.out.println(var1);
но это:
println("logProperty: " this::lateinitVar.isInitialized)
компилируется для:
String var1 = "logProperty: " (((MyClass)this).lateinitVar != null);
System.out.println(var1);