Java 检查null时的惯用Kotlin

Java 检查null时的惯用Kotlin,java,kotlin,idioms,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

在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()
    }

}
        internal class Record(var name: String, var address: String)

    internal class Person {

        private var record: Record? = null

        fun name(): String {
            return record()!!.name
        }

        private fun record(): Record? {
            if (record == null) {
                refetch()
            }
        return record
        }

        private fun refetch() {
            record = Record("Joe Smith", "101 Broadway, NYC, NY")
        }

    }
在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)
),我会得到以下错误:

智能转换为“记录”是不可能的,因为“记录”是可变的 此时可能已更改的属性


在惯用的Kotlin中,您将使用:


你是Java代码没有编译,所以我模拟了一个例子

    class Record {
        String name;
        String address;

        Record(String name, String address) {
            this.name = name;
            this.address = address;
        }

        String getName() {
            return name;
        }
    }

    class Person {

        private Record record;

        public String name() {
            return record().getName();
        }

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

        private void refetch() {
            record = new Record("Joe Smith", "101 Broadway, NYC, NY");
        }

    }
Kotlin强制您在定义某个值时使用“?”字符来声明该值是否可为null。所以它需要像这样:

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()
    }

}
        internal class Record(var name: String, var address: String)

    internal class Person {

        private var record: Record? = null

        fun name(): String {
            return record()!!.name
        }

        private fun record(): Record? {
            if (record == null) {
                refetch()
            }
        return record
        }

        private fun refetch() {
            record = Record("Joe Smith", "101 Broadway, NYC, NY")
        }

    }

为什么对空安全类型使用空检查?可能是@Zoe的重复项抱歉,我错过了
。在Kotlin中,您将使用一个延迟初始化的委托属性:谢谢。如何强制重新初始化?i、 e.再次调用'service.doSomething()。这可能吗?好吧,stdlib中没有这样的功能。您需要自己实现一个ResettableLazy。一个快速的谷歌搜索结果是:非常感谢。我会的。