Kotlin'de yapıcı içinde veya sınıf gövdesinin üstünde bir sınıf özelliği başlatmak istemiyorsanız, temel olarak şu iki seçeneğe sahipsiniz (dil başvurusundan):
tembel (), bir lambda alan ve tembel bir mülkün uygulanması için temsilci olarak işlev görebilen bir Lazy örneğini döndüren bir işlevdir: get () için ilk çağrı, tembel () öğesine geçirilen lambda'yı yürütür ve sonucu hatırlar, sonraki çağrılar get () sadece hatırlanan sonucu döndürmek.
Misal
public class Hello { val myLazyString: String by lazy { "Hello" } }
O kadar nerede olursa olsun ilk çağrıdan ve subquential çağrılar, Yani myLazyString dönecektir "Merhaba"
Normalde, boş olmayan tür olarak bildirilen özelliklerin yapıcıda başlatılması gerekir. Ancak, oldukça sık olarak bu uygun değildir. Örneğin, özellikler bağımlılık enjeksiyonu yoluyla veya bir birim testinin kurulum yönteminde başlatılabilir. Bu durumda, yapıcıda null olmayan bir başlatıcı sağlayamazsınız, ancak bir sınıfın gövdesindeki özelliğe başvururken yine de null denetimlerden kaçınmak istersiniz.
Bu durumu işlemek için özelliği lateinit değiştiricisiyle işaretleyebilirsiniz:
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }
Değiştirici yalnızca bir sınıfın gövdesinde bildirilen var özelliklerinde (birincil kurucuda değil) ve yalnızca özelliğin özel alıcı veya ayarlayıcıya sahip olmadığında kullanılabilir. Özelliğin türü boş olmamalı ve ilkel bir tür olmamalıdır.
Peki, bu iki seçenek arasında doğru seçim nasıl yapılır, çünkü ikisi de aynı sorunu çözebilir?
lateinit
özelliği Kotlin ve Java erişim yolları farklı böylece destek alanı ayarlayıcı görünürlüğü ile ortaya ekler . Ve Java kodundan bu özelliknull
Kotlin'de herhangi bir kontrol yapılmadan bile ayarlanabilir . Bu nedenlelateinit
tembel başlatma için değil, Kotlin kodundan başlatma için değil.