
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
veyaval
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.