如果不为null,则更新对象的属性;如果为null,则创建新对象,然后设置属性

时间:2019-09-26 15:35:50

标签: android kotlin

我正在尝试找到最好的,最干净的方法来更新也是一个对象的可空对象属性。伪代码:

class MyClass {
   val myNullableProperty: MyPropertyClass? 
}

这是我到目前为止的丑陋解决方案:

val myProperty = myClass.myNullableProperty ?: MyPropertyClass() // MyPropertyClass has default constructor values so this is fine instantiating like this in my example
myProperty.name = "Name" 
myClass.myNullableProperty = myProperty

这只是感觉不是最好的方法。我觉得有一种使用let / apply / with / run等的解决方案。-这样定义局部变量myProperty,然后稍后将其设置为myNullableProperty感觉很浪费。

我正在寻找可以检索现有属性或创建新属性,然后立即在该属性上设置值的东西。

2 个答案:

答案 0 :(得分:1)

将值分配给自己,如果为空,则分配一个新实例:

myClass.myNullableProperty = myClass.myNullableProperty?: MyPropertyClass()

如果要避免进一步的空检查:

myClass.myNullableProperty = (myClass.myNullableProperty?: MyPropertyClass()).apply{ 
    name = "Name" 
}

如果对属性的访问是单线程的,则可以通过以下方式避免所有不必要的分配:

if (myClass.myNullableProperty == null)
    myClass.myNullableProperty = MyPropertyClass()
myClass.myNullableProperty!!.name = "Name"

答案 1 :(得分:0)

如果您想让它更实用,请

myClass.myNullableProperty?.let {
   it.name = "Name"
} ?: run {
   myClass.myNullableProperty = MyPropertyClass().apply {
      name = "Name"
   }
}