繁体   English   中英

仅当输入不为null时才如何使用kotlin的默认参数?

[英]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 通过提供适当的构造函数或适当的工厂功能。 以下只是众多变体之一(现在使用Companioninvoke ):

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM