java - 检查 null 时惯用的 Kotlin

标签 java kotlin idioms

在 Java 中,我会这样做:

class Person {

    private Record record;

    public String name() {
      record().get("name");
    }

    private Record record() {
      if (record == null) {
        refetch();
      }
      return record;
    }

    private void refetch() {
      record = service.doSomething()
    }

}

在 Kotlin 中,我有以下等效代码:

class Person(private var record: Record?) {

    fun name() : String {
      record().get("name");
    }

    private fun record() : Record {
      record ?: refetch()
      return record!!;
    }

    private fun refetch() {
      record = service.doSomething()
    }

}

如您所见,我正在使用 !! 运算符,但我不太喜欢。还有另一种更惯用的方法吗?

如果我简单地遵循 Java 方式 (if (record == null)),我会得到这个错误:

Smart cast to "Record" is impossible, because "record" is a mutable property that could have been changed by this time

最佳答案

在惯用的 Kotlin 中,您将使用 lazy delegated property :

class Person(private val service: Service) {

    private val record by lazy { service.doSomething() }

    fun name() = record.get("name");
}

关于java - 检查 null 时惯用的 Kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53459873/

相关文章:

kotlin - 在 Kotlin 中处理可为空或空列表的惯用方式

java - 图形用户界面

clojure - 从 clojure 中的普通 lisp 替换 (null x) 函数的惯用方法

java - 在android中使用新的SQLite数据库恢复和删除旧的SQLite数据库

java - Rabbitmq Java 客户端中的代理

android - Jetpack Compose LazyColumn 使用 remember() 重构

android - 如何解决 "Inconsistencies in the existing project dependencies found"的问题?

java - 创建简单的 Spring AOP 时出现异常抛出建议演示

java - Neo4j 可视化和检索数据

kotlin - 如何为类型别名的伴随对象定义扩展函数?