返回

那些Kotlin可有可无的语法糖

Android

这几天在 review 同事的代码的时候,发现一块有意思的代码,我将其写成对应的伪代码如下:

class MyClass {
    val myProperty: Int = 10
}

fun main() {
    val myObject = MyClass()
    println(myObject.myProperty)
}

起初在看到这段代码的时候,觉得十分反人类,在 Kotlin 中,对象的初始化可以省略 new 操作符,也即

class MyClass {
    val myProperty: Int = 10
}

fun main() {
    val myObject = MyClass()
    println(myObject.myProperty)
}

class MyClass {
    val myProperty = 10
}

fun main() {
    val myObject = MyClass()
    println(myObject.myProperty)
}

效果完全一致。由于 Kotlin 可以省略 new 操作符,如果属性没有初始化,就会报错:

class MyClass {
    val myProperty
}

fun main() {
    val myObject = MyClass()
    println(myObject.myProperty)
}

报错信息为:

Kotlin: Unresolved reference: myProperty

所以当我们看到

class MyClass {
    val myProperty: Int
}

fun main() {
    val myObject = MyClass()
    println(myObject.myProperty)
}

的时候,我们知道 myProperty 属性一定被初始化了,否则就会报错。但是当我们看到

class MyClass {
    val myProperty = 10
}

fun main() {
    val myObject = MyClass()
    println(myObject.myProperty)
}

的时候,我们就不知道 myProperty 属性是否被初始化了。

当然,我们可以通过阅读代码来判断 myProperty 属性是否被初始化了。但是,如果代码很长,或者我们对 Kotlin 不熟悉,就很容易出错。

为了避免这种错误,我们应该始终在属性声明中显式地初始化属性。这样,我们就可以一目了然地知道属性是否被初始化了。

除了属性初始化之外,Kotlin 还有一些其他的可有可无的语法糖。例如,我们可以使用 when 表达式来代替 if-else 语句。但是,when 表达式可能会使代码更难阅读。因此,我们应该谨慎使用 when 表达式。

总之,Kotlin 是一门非常强大的编程语言。但是,它也有一些可有可无的语法糖。这些语法糖可能会降低代码的可读性和质量。因此,我们应该谨慎使用这些语法糖。