В котлине за латинит почему он должен использовать «this ::» - PullRequest
0 голосов
/ 13 марта 2019

doc показывает пример проверки того, была ли инициализирована переменная lateinit:

println("isInitialized before assignment: " + this::lateinitVar.isInitialized)
lateinitVar = "value"
println("isInitialized after assignment: " + this::lateinitVar.isInitialized)

Почему он должен использовать "this ::" в качестве квалификатора

1 Ответ

1 голос
/ 16 мая 2019

Ответ лежит в декомпилированном байт-коде.Когда вы вызываете 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);
...