检查 null 时惯用的 Kotlin
Idiomatic Kotlin when checking null
在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 代码没有编译,所以我模拟了一个例子。
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 强制您使用“?”声明一个值是否可为空定义它时的字符。所以它需要看起来像这样:
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")
}
}
在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 代码没有编译,所以我模拟了一个例子。
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 强制您使用“?”声明一个值是否可为空定义它时的字符。所以它需要看起来像这样:
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")
}
}