[英]How to use kotlin's default parameter only if the input is not null?
例:
data class Something(val mendatory: String = "default value")
val userInput: String? by SomeTypeOfInputFieldThatReturnsNullable
//val something = Something(userInput) //not valid because userInput is String?
val something = if (userInput == null)
Something()
else
Something(userInput)
是否有一些更简单的方法告诉Kotlin仅在不为null时传递参数?
取决于您的意思,而不是冗长。
一种方法是使用null-safe-operator( ?.
)和诸如let
东西:
val something = userInput?.let(::Something)
?: Something()
我是否要那么冗长取决于您自己。
另一个变体是基本上只将null
值传递给data class
。 通过提供适当的构造函数或适当的工厂功能。 以下只是众多变体之一(现在使用Companion
和invoke
):
data class Something(val mandatory: String) {
companion object {
operator fun invoke(s : String? = null) = Something( s ?: "default value")
}
}
然后调用它看起来像:
val something = Something(userInput) // if userInput is String? the companion function is called... if it's String, the constructor is used
// or also using invoke:
val something = Something() // now with s = null, leading to "default value"
我可以想到几种方法,但是所有方法都涉及到重复某处…
如果这是唯一需要默认值的地方,则可以将其移出类:
data class Something(val mandatory: String)
val something = Something(userInput ?: "default value")
或者,您可以允许构造函数采用null-但随后您需要将可为null的构造函数参数与non-null属性分开:
data class Something(mandatoryParam: String?) {
val mandatory = mandatoryParam ?: "default value"
}
val something = Something(userInput)
或者,Roland在他的答案中列出了一些选择:在确定要调用的构造函数时,请使用let
避免重复。 或在随播对象上使用伪构造函数。
因此,没有一个明显的答案。 (我认为我可能更喜欢上面介绍的两种方法之一,这取决于默认值是否以某种方式与该特定用户输入相关,或者无论构造对象时该默认值是否必须一定都适用。)
另一个解释了许多解决方案……最好的解决方案是:
val something = userInput?.let(::Something) ?: Something()
但是,如果将“ val”更改为“ var”,那么还有另一种方法:
data class Something(var mendatory: String = "default value")
val userInput: String? by SomeTypeOfInputFieldThatReturnsNullable
val something = Something().apply { userInput?.let { mendatory = userInput } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.