0

The doc shows sample for checking whether a lateinit var has been initialized:

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

Why it has to use the "this::" as its qualifier

lannyf
  • 9,865
  • 12
  • 70
  • 152

1 Answers1

1

The answer lays in decompiled bytecode. When you call lateinitVar you access field with initialization check:

println("logProperty: " + lateinitVar)

is compiled to:

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);

but this:

println("logProperty: " + this::lateinitVar.isInitialized)

is compiled to:

String var1 = "logProperty: " + (((MyClass)this).lateinitVar != null);
System.out.println(var1);