kotlin的可变价值

来源:互联网 发布:做网络销售怎么样 编辑:程序博客网 时间:2024/05/16 17:29

科特林的可变价值

当我第一次学习科特林,差异val和var看似简单:val意味着不变,var意味着可变。

真相比这更微妙:val并不意味着不变,val意思是只读。这意味着您不能明确写入val,但不能保证它们是不可变的1。

可变类属性
对于变量,immutable和read-only之间的区别是一个模糊点。没有办法写一个val变量或者覆盖它是如何被检索的,所以它(对于所有意图和目的)是不可变的。

然而,对于类属性,只读性质val产生巨大差异。

在属性的上下文中,valvs. var表示属性是否存在getter / setter。A var既有吸气剂又有吸气剂,而val只有吸气剂。

在简单的情况下,缺少setter意味着val类属性是不可变的。但是,可以为任何类属性添加一个自定义getter函数,允许您在每次有人访问该属性时返回任何所需的内容。例如:

class Person(val birthDay: DateTime) {
val age: Int
get() = yearsBetween(birthDay, DateTime.now())
}
如您所见,没有明确的设置方式Person.age,但Person.age会随当前日期的更改而改变值。

事实上,Person.age作为一个变量的思考根本就是一个不正确的词。它实际上是一个getter函数,你可以调用它可能会改变调用值。

后果
当我了解Kotlin的可变值时,我亲自感到恐惧。我觉得被背叛了 - val而不是var将数据标记为不可变的,而且可变的是Kotlin我学到的第一个很酷的功能之一!

据我所知,对于val属性可定制的getter有两个参数:

类属性仅仅是getter / setter的缩写,而定制的getter通常被认为是好的。
可定制的getter启用委托属性。
委托的属性是一个引人注目的用例,我将继续使用它们。但是,当我想到val一个不可替代的引用时,我觉得代码更简单。不变性使代码(特别是并发代码)更容易使用。

因此,我选择不为val类属性使用定制getter 。如果只读类属性随时间更改值,则替换该属性与正常函数:

class Person(val birthDay: DateTime) {
fun age(): Int = yearsBetween(birthDay, DateTime.now())
}
这个偏好是Kotlin编码约定的建议。它表示,只有当底层算法时,您应该优先于一个函数:

不投掷
具有O(1)复杂性
很便宜的计算(或在第一次跑步)
通过调用返回相同的结果
覆盖吸气剂并更改参考线违反了最后的条件,所以避免这样做!

为了简洁起见,在这篇文章中,“不可变的”实际上意味着“不可变的参考”。您可以随时引用可变对象(如ArrayList)。在这种情况下保护可变性需要比使用val的更先进的技术,我不会进入这里。↩

原创粉丝点击