属性表示状态而不是行为(Properties should represent state, not behavior)
Kotlin中的属性(property)不同于Java中的域(field),Kotlin中的属性应该看作是field + getter (+ setter):
var name: String? = null
get() = field?.toUpperCase()
set(value) {
if(!value.isNullOrBlank()) {
field = value
}
}
当然对于只读属性val
是没有setter的。field也不是必须的,所以说,属性本质上讲就是function。正因为属性是function的本质,在Kotlin中某些方法也可以用属性来表示:
val Context.notificationManager
// or
fun Context.getNotificationManager()
那么什么时候应该使用属性,什么时候应该使用方法呢?这一条就是回答这个问题,基本原则是,属性表示的是状态,方法表示的是行为。在以下典型情形下应该考虑使用方法而不是属性:
- 存在计算密集型运算,或者计算复杂度非常数O(1)。
- 包含业务逻辑。
- 非幂等,即连续多次调用会返回不一样的结果。
- 方法的执行顺序影响返回值。
- 可能抛出异常。