java - 仅当变量为空时才在 Kotlin 中实例化变量?

标签 java kotlin nullable getter backing-field

比方说,我有一个变量:

var myObject : 我的对象? = 空

它应该在某个地方被清除:

myObject?.clear
myObject = null

并且在使用的地方应该绝对不可为空。在 Java 中我可以这样做:

private MyObject getMyObject(){
  if(myObject == null) {
    myObject = new MyObject()
  }
  return myObject
}

问题:我如何在 Kotlin 中实现这一目标?

我找到了使用 elvis-operator 的建议:

private fun getMyObject() = myObject ?: MyObject()

但这不会将结果(如果将创建 MyObject 的新实例)分配给 myObject 变量。 请帮我解决和解释。先谢谢了

最佳答案

问题是属性的 getter 和 setter 不能有不同的类型。我建议一个单独的可为 null 的私有(private)属性和一个清除它的方法:

private var _myObject: MyObject? = null

var myObject: MyObject // or val, depending
    get() {
        if (_myObject == null) { _myObject = MyObject() }
        return _myObject!!
    }
    set(value: MyObject) { 
        _myObject?.clear()
        _myObject = value
    }

fun clearMyObject() {
    _myObject?.clear()
    _myObject = null
}

如果你多次需要这个模式,写一个delegate .

关于java - 仅当变量为空时才在 Kotlin 中实例化变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54568266/

相关文章:

android - java/kotlin 模块中的 Jetpack Paging 3

validation - 如何确保在Grails中设置 boolean 字段?

c# - 满足或静音可为空的泛型类型属性警告

Java正则表达式。获取某些关键字之间的子字符串

android - 在 Android 中定期刷新数据的最佳方法

java - Hibernate 多对多删除关系

collections - 将 int 列表折叠为 kotlin 中的范围列表

objective-c - 从可空对象转换为非空对象 (Objective-C)

java - 如何在 java.util.Set 中获取项目的索引

java - 如何将时间戳附加到 java.util.logging.FileHandler.pattern 的文件名