Kotlin:乐趣与Val

时间:2019-03-01 17:02:16

标签: kotlin

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

让我说一堂课

class Car(val color: String)

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

fun isWhite(car: Car): Boolean {
  return car.color == "WHITE"
}

现在我希望此函数为member function,如下所示:

class Car(val color: String) {
  fun isWhite(): Boolean = color == "WHITE"
}

但它也可以像这样:

class Car(val color: String) {
  val isWhite: Boolean get() = color == "WHITE"
}

那有什么更好的呢?

2 个答案:

答案 0 :(得分:11)

官方Kotlin Coding Conventions功能与属性部分中定义以下内容:

  

在某些情况下,不带参数的函数可以与只读属性互换。尽管语义相似,但是在何时首选一个相对另一个上存在一些样式约定。

     

在使用基础算法时优先使用函数的属性:

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

因此,在以上示例中,我将val用作isWhite,因为它不会抛出异常,因此String比较比较便宜,而color的{​​{1}} }不能更改,因为Car本身定义为Car.color

编译差异

请注意,val块的JVM字节码将被编译为与该函数完全相同的代码。因此,这两种方法都来自编译后的字节码相同的there is no performance difference

答案 1 :(得分:-1)

个人偏好。

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

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