繁体   English   中英

可空成员的延迟初始化

[英]Lazy initialization of nullable member

如果我们将成员变量定义为

private var foo: Foo? = null

当我们调用带有参数的方法(初始化Foo时需要)时,我们想要初始化它,有没有比这更好的方法呢?

fun generateFoo(bar: Bar): Foo {
    var localFoo = foo
    if (localFoo == null) {
        localFoo = Foo(bar)
        foo = localFoo
    }
    return localFoo
}

我正在考虑避免所有变量赋值。

编辑:这里的版本略短,但仍不理想

fun generateFoo(bar: Bar): Foo {
    var localFoo = foo ?: Foo(bar)
    foo = localFoo
    return localFoo
}

这是安全的,除非你有多个线程命中你的类:

fun generateFoo(bar: Bar): Foo {
    if (foo == null) {
        foo = Foo(bar)
    }
    return foo!!
}

但是,如果你愿意,你可以做这样的事情 - 取决于你是否认为这比你已经拥有的更长的版本更具可读性:

fun generateFoo(bar: Bar) = foo ?: Foo(bar).also { foo = it }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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