Kotlin 科特林:有趣vs瓦尔

Kotlin 科特林:有趣vs瓦尔,kotlin,Kotlin,Kotlin支持计算属性,但我不确定何时使用它们 假设我有一门课: class Car(val color: String) 如果车辆为白色,则此函数将返回true: fun isWhite(car: Car): Boolean { return car.color == "WHITE" } 现在我想让这个函数成为一个成员函数,如下所示: class Car(val color: String) { fun isWhite(): Boolean = color == "WHITE"

Kotlin支持
计算属性
,但我不确定何时使用它们

假设我有一门课:

class Car(val color: String)
如果车辆为白色,则此函数将返回
true

fun isWhite(car: Car): Boolean {
  return car.color == "WHITE"
}
现在我想让这个函数成为一个
成员函数
,如下所示:

class Car(val color: String) {
  fun isWhite(): Boolean = color == "WHITE"
}
class Car(val color: String) {
  val isWhite: Boolean get() = color == "WHITE"
}
但它也可以是这样的:

class Car(val color: String) {
  fun isWhite(): Boolean = color == "WHITE"
}
class Car(val color: String) {
  val isWhite: Boolean get() = color == "WHITE"
}
那么什么更好呢?

个人偏好

我的观点是,如果您不需要传递任何内容,那么将其创建为属性

但是如果您需要向它传递更多信息,它必须是一个函数

官员在“功能与属性”一节中定义了以下内容:

在某些情况下,没有参数的函数可以与只读属性互换。虽然语义是相似的,但在什么时候更喜欢一个而不是另一个方面有一些文体惯例

如果基础算法:

  • 不扔
  • 计算成本低(或在第一次运行时计算)
  • 如果对象状态没有更改,则在调用时返回相同的结果
因此,在上面的示例中,我将使用
val
表示
isWhite
,因为它不会抛出,字符串比较计算起来很便宜,
Car
color
不能更改,因为
Car.color
本身被定义为
val

汇编差异


请注意,
get()
块的JVM字节码将被编译成与函数完全相同的代码。因此,这两种方法都来自编译的字节码,并且都是相同的。

有人能解释一下“不抛出”是什么意思吗?它的意思是“我确信这个属性不会抛出任何异常”?@elliotching是的,没错。关于“计算成本低”这不是一个实现细节吗?