Kotlin术语mutable是否存在使用不当的问题?var与val可变性疑问
你对相关概念的认知完全正确,这也不是语言的命名不当问题,var/val的约束和对象可变性本来就是编程语言中完全独立的两个维度。
1. var/val仅约束引用的可重赋值性
你之前的对应理解完全成立:val本质上和Java中用final修饰引用类型变量的作用完全一致,仅限制标识符对应的内存地址不能被修改,不涉及地址指向的对象本身的操作限制。
代码示例:
// var 声明的引用支持重赋值 var mutableRef = mutableListOf(1, 2, 3) mutableRef = mutableListOf(4, 5, 6) // 编译合法,修改的是mutableRef指向的地址 // val 声明的引用不支持重赋值 val immutableRef = mutableListOf(1, 2, 3) immutableRef = mutableListOf(4, 5, 6) // 编译报错,无法修改val引用的指向
2. 对象可变性由类的实现决定
你提到的mutability(可变性)指的是对象实例被创建后,自身的属性/状态能否被修改,这个能力完全由类的定义决定,和你用var还是val存储它的引用没有任何关系。
比如上面用val声明的immutableRef,我们完全可以在不重赋值引用的前提下修改指向的列表内容:
val immutableRef = mutableListOf(1, 2, 3) immutableRef.add(4) // 编译合法,修改的是列表对象本身的内容,没有修改引用指向 println(immutableRef) // 输出 [1, 2, 3, 4]
如果想要实现完全不可变的绑定,需要同时满足两个条件:用val声明引用保证不可重赋值,同时指向本身不可变的对象实例,比如Kotlin的不可变集合:
val fullImmutable = listOf(1, 2, 3) // fullImmutable.add(4) 编译报错,listOf返回的是不可变集合实例,本身不支持修改内容
内容的提问来源于stack exchange,提问作者heapoverflow
相关产品推荐
相关产品推荐

