Kotlin Çoklu Yapıcılarını Anlayın

Kotlin Çoklu Yapıcılarını Anlayın

Kotlin’de bir birincil ve birçok ikincil kurucunuz var.

Birincil Oluşturucu

Bu, bir parametreli birincil kurucudur.

class Example constructor(private val param1: String) {
    init {
        println("init is called.")
    }
}

Ayrıca şunları da atlayabilirsiniz: constructor anahtar kelime.

class Example(private val param1: String) {
    init {
        println("init is called.")
    }
}

Birincil kurucuda başlatamazsınız. Bunun yerine, kodunuzu şurada başlatmanız gerekir: init{} engellemek.

İkincil Oluşturucu

Aşağıda 2 ikincil kurucu var.

class Example(private val param1: String) {

    init {
        println("init is called.")
    }

    
    constructor(
        param1: String, 
        param2: String) : this(param1) {

        println("Second constructor is called")
    }

    
    constructor(
        param1: String, 
        param2: String, 
        param3: String) : this(param1) {

        println("Third constructor is called")
    }
}

Burada birkaç önemli not:

  • Birincil kurucuyu aramanız gerekir (örn. this(param1)). Tam olarak değil! Bir sonraki bölüme bakın – Başka Bir İkincil Oluşturucu Çağırın
  • beyan edebilirsin var veya val ikincil kurucu parametresinde
  • Kodunuzu ikincil kurucuda başlatabilirsiniz.

Lütfen birincil kurucunun init{} blok, ikincil kurucu başlatmadan önce çağrılır.

Yani, eğer üçüncü kurucuyu çağırırsam,

val obj = Example(param1="1", param2="2", param3="3")

çıktı şu şekilde olacaktır.

init is called.
Third constructor is called

Başka Bir İkincil Oluşturucu Çağırın

İkincil kurucunuzdaki birincil kurucuyu çağırmak yerine, başka bir ikincil kurucuyu da çağırabilirsiniz.

Bu örnekte, ikinci ikincil kurucu, birinci ikincil kurucuyu çağırır.

class Example(private val param1: String) {

    init {
        println("init is called.")
    }

    
    constructor(
        param1: String,
        param2: String) : this(param1) {

        println("Second constructor is called")
    }

    
    constructor(
        param1: String,
        param2: String,
        param3: String) : this(param1, param2) {

        println("Third constructor is called")
    }
}

Üçüncü kurucuyu çağırırsam, çıktı şöyle görünür:

init is called.
Second constructor is called
Third constructor is called

Boş Birincil Oluşturucu

Bu, boş bir birincil kurucu ve ikincil kurucu örneğidir.

class Example() {
    init {
        println("init is called.")
    }

    constructor(param1: String): this() {
        println("Second constructor is called")
    }
}

Ancak, gerçekten aramanıza gerek yok this() ikincil kurucunuzda. Ayrıca değiştirmeniz gerekiyor Example() ile Example.

class Example {
    init {
        println("init is called.")
    }

    constructor(param1: String) {
        println("Second constructor is called")
    }
}

İkincil Oluşturucu Kullanım örneği

Hilt bağımlılığını Görünüm Modelime enjekte etmek istediğimde ikincil kurucu kullanma ihtiyaçlarıyla karşılaştım.

böyle bir kodum var preview parametre için kullanılır @preview jetpack oluşturur. olarak ayarlandı true sadece @preview. Ancak, bu değişikliği kullanmak için taşırsam Hilt bağımlılık enjeksiyonu, bu bağımlılığı enjekte edemez.

class MainViewModel(
    private val repository: ArticlesRepository,
    preview: Boolean = false,
) : ViewModel() {
   
}

Böylece, bunu aşağıdaki ikincil kurucuya böldüm.

class MainViewModel(private val repository: ArticlesRepository) : ViewModel() {

    constructor (repository: ArticlesRepository, preview: Boolean) : this(repository) {
        
    }
}

bu yüzden kullanıyorum @Inject constructor birincil kurucu için ve ikincil kurucu için kullanılır @preview.

İle birlikte Hilt uygulama, bu gibi görünüyor

@HiltViewModel
class MainViewModel
    @Inject constructor(
        private val repository: ArticlesRepository,
    ) : ViewModel() {

    constructor (repository: ArticlesRepository, preview: Boolean) : this(repository) {
        
    }
    
}

Çözüm

Çok sayıda birden fazla kurucu kullanmadım, değil mi? Bu yüzden, gelecekteki referansım için bunu burada belgeledim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.