val和var都用于声明变量,但有根本的不同:
val number = 42 // number = 10 // 错误!
var counter = 0 counter++ // 允许
安全性和性能:
val——这可以防止意外修改,并使代码更易于理解。val可以让编译器和IDE在编译阶段捕获错误并优化代码。声明为
val的对象可以被修改吗?
答案: 变量本身(引用)的值不能被重新分配,但如果这是一个对象(例如列表),它的内部状态是可以改变的.
val list = mutableListOf(1,2) list.add(3) // 可以!而list = 另一个列表将是错误的.
故事
在一个在线商店项目中,开发者将商品列表定义为
val items = mutableListOf<Product>(),认为这样列表是完全不可变的。实际上在另一部分中更改了列表(添加了新元素),意外影响了购物车的展示。
故事
在大文本文件解析器中,数组缓冲区被声明为
var buffer,尽管在解析过程中并不需要更换。意外地错误地重新分配新数组,导致内存泄漏和数据处理错误。
故事
在某个微服务的代码中,大多数变量被声明为
var"以防万一",最终在大型表达式中对象的状态有时在不同线程中被更改,这导致了由于竞态条件而产生的难以发现的错误。