Kotlin:好玩vs val

fun*_*ude 6 kotlin

Kotlin支持,computed properties但我不确定何时使用它们.

假设我有一节课:

class Car(val color: String)
Run Code Online (Sandbox Code Playgroud)

并且true如果汽车是白色的,则返回此功能:

fun isWhite(car: Car): Boolean {
  return car.color == "WHITE"
}
Run Code Online (Sandbox Code Playgroud)

现在我希望这个函数是a member function,这看起来像这样:

class Car(val color: String) {
  fun isWhite(): Boolean = color == "WHITE"
}
Run Code Online (Sandbox Code Playgroud)

但它也可以是这样的:

class Car(val color: String) {
  val isWhite: Boolean get() = color == "WHITE"
}
Run Code Online (Sandbox Code Playgroud)

那么更好的是什么?

von*_*ox7 11

官方Kotlin编码约定在Section Functions vs Properties中定义如下:

在某些情况下,没有参数的函数可以与只读属性互换.尽管语义相似,但是对于何时优先选择彼此,存在一些风格约定.

在基础算法时首选属性而不是函数:

  • 不扔
  • 计算起来很便宜(或在第一次运行时计算)
  • 如果对象状态未更改,则在调用时返回相同的结果

所以我会在上面的示例中使用valisWhite,因为它不扔,字符串比较便宜,计算和colorCar不能改变,因为Car.color本身定义为val.

编译差异

请注意,get()块的JVM字节码将被编译为与函数完全相同的代码.因此两种方法都来自编译后的字节码相同且没有性能差异.