有没有办法使用默认值的非可选参数时通过null?
例如,如果我有以下数据类:
data class Data( val name: String = "", val number: Long = 0 )
和可以返回null
函数:
fun newName(): String? {} fun newNumber(): Long? {}
我知道我可以使用下面的函数的值,如果它们不为null
:
val newName = newName() val newNumber = newNumber() val data = Data( if (newName != null) newName else "", if (newNumber != null) newNumber else 0 )
但是,有没有办法只是使用Data
类的构造函数中指定的默认值,当值为null
?
我找不到任何文件,但我希望这样的事情可以工作:
val data = Data(newName()?, newNumber()?)
但是这不能编译。
您可以创建一个辅助构造函数 ,它在接收null
时使用相同的默认值:
data class Data( val name: String = "", val number: Long = 0 ) { constructor( name: String? = null, number: Long? = null ) : this( name ?: "", number ?: 0 ) }
次构造器只支持Nullable原始属性。 这意味着如果该属性不是基本类型,将导致2个相同的构造函数,例如:
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) }
另一种方法是使用invoke
操作符,例如:
data class Data(val name: String) { companion object { operator fun invoke(name: String? = null) = Data(name ?: "") } }
如果类不是数据类,那么可以从参数中初始化属性,而不是在主构造函数中定义属性,例如:
class Data(name: String? = null, number: Long? = null) { val name = name ?: "" val number = number ?: 0 }