Kotlin - Eigenschaftsinitialisierung mit "by lazy" vs. "lateinit"

Wenn Sie in Kotlin keine Klasseneigenschaft innerhalb des Konstruktors oder im oberen Bereich des Klassenkörpers initialisieren möchten, haben Sie im Grunde folgende zwei Optionen (aus der Sprachreferenz):

Lazy Initialization

lazy () ist eine Funktion, die ein Lambda nimmt und eine Instanz von Lazy zurückgibt, die als Delegat für die Implementierung einer Lazy-Eigenschaft dienen kann: Der erste Aufruf von get () führt das an lazy () übergebene Lambda aus und merkt sich anschließend das Ergebnis Aufrufe von get () geben einfach das gespeicherte Ergebnis zurück.

Beispie

public class Hello {

   val myLazyString: String by lazy { "Hello" }

}

So der erste Anruf und die untergeordneten Anrufe, wo immer es ist, an myLazyString wird zurückkehren"Hallo"

Late Initialization

Normalerweise müssen Eigenschaften, deren Typ nicht Null ist, im Konstruktor initialisiert werden. Dies ist jedoch ziemlich häufig nicht zweckmäßig. Beispielsweise können Eigenschaften durch Abhängigkeitsinjektion oder in der Einrichtungsmethode eines Komponententests initialisiert werden. In diesem Fall können Sie im Konstruktor keinen Nicht-Null-Initialisierer angeben, aber Sie möchten trotzdem Nullprüfungen vermeiden, wenn Sie auf die Eigenschaft im Hauptteil einer Klasse verweisen.

Um diesen Fall zu behandeln, können Sie die Eigenschaft mit dem lateinit-Modifikator markieren:

public class MyTest {

   lateinit var subject: TestSubject

   @SetUp fun setup() { subject = TestSubject() }

   @Test fun test() { subject.method() }
}

Der Modifikator kann nur für var-Eigenschaften verwendet werden, die im Hauptteil einer Klasse deklariert sind (nicht im primären Konstruktor), und nur dann, wenn die Eigenschaft keinen benutzerdefinierten Getter oder Setter hat. Der Typ der Eigenschaft darf nicht null und kein primitiver Typ sein.

So, wie wählt man richtig zwischen diesen beiden Optionen, da beide das gleiche Problem lösen können?

Antworten auf die Frage(12)

Ihre Antwort auf die Frage