2017-06-23 65 views
10

:Boş değer geçtiğinde, isteğe bağlı olmayan bir parametrede varsayılan değeri kullanmanın bir yolu var mı? Aşağıdaki veri sınıfını varsa, örneğin

data class Data(
    val name: String = "", 
    val number: Long = 0 
) 

Ve fonksiyonları null dönebilmek:

fun newName(): String? {} 

fun newNumber(): Long? {} 

Ben fonksiyonların değerini kullanmak için aşağıdaki kullanabilirsiniz biliyorum onlar eğer değil null:

val newName = newName() 
val newNumber = newNumber() 

val data = Data(
     if (newName != null) newName else "", 
     if (newNumber != null) newNumber else 0 
) 

Ama sadece con belirtilen varsayılan değeri kullanmak için bir yol var değerler null olduğunda Data sınıfının structor'ı?

ben belgelerinde şey bulamadı, ama böyle bir şey işe umuyordum:

val data = Data(newName()?, newNumber()?) 

Ama bu derleme değil.

+0

"if (newName! = Null) newName else" "yerine" newName?: "" 'I kullanabilirsiniz. Buna elvis operatörü denir. – Mibac

+0

@Mibac Oh, bunu unutmuşum! Kesinlikle daha özlü, ancak hala sınıf yapıcısında tanımlanan varsayılan parametreyi kullanmıyor. – Bryan

cevap

5

Sen null alırken aynı varsayılan değerlerini kullanan bir secondary constructor oluşturabilirsiniz:

data class Data(
     val name: String = "", 
     val number: Long = 0 
) { 
    constructor(
      name: String? = null, 
      number: Long? = null 
    ) : this(
      name ?: "", 
      number ?: 0 
    ) 
} 
+0

Oh, bu güzel bir çalışma! Yine de, bana bu dilin içine inşa edilmiş bir şey dilemeyi sağlar; sadece kazandan kurtulmak için. – Bryan

4

ikincil yapıcı yalnızca null ilkel özellikleri için destekler. Örneğin alternatif bir yol bunun için invoke operatör kullanan

data class Data(val name: String) { 
    constructor(name: String? = null) : this(name ?: "foo"); 
    // ^--- report constructor signature error     
} 

data class Data(val number: Long = 0) { 
    constructor(number: Long? = null) : this(number ?: 0) 
    //     ^--- No problem since there are 2 constructors generated: 
    //      Data(long number) and Data(java.lang.Long number) 
} 

,:

data class Data(val name: String) { 
    companion object { 
     operator fun invoke(name: String? = null) = Data(name ?: "") 
    } 
} 

IF hangi özelliği, örneğin, basit bir tür değilse o 2, aynı kurucular neden olur demektir sınıfı veri sınıf değil daha sonra can parametreleri yerine örneğin primer yapıcı özelliklerini tanımlamak daha yavaş başlatma özellikleri:

class Data(name: String? = null, number: Long? = null) { 
    val name = name ?: "" 
    val number = number ?: 0 
}