编程后端开发者

Kotlin中关键字"val"和"var"之间有什么区别?如何从安全性和代码性能的角度优化它们的使用?

用 Hintsage AI 助手通过面试

答案。

valvar都用于声明变量,但有根本的不同:

  • val(value):声明一个不可变的只读引用。初始化后,值不可重新分配,引用将永远指向一个对象:
val number = 42 // number = 10 // 错误!
  • var(variable):声明一个可变变量;
var counter = 0 counter++ // 允许

安全性和性能:

  • 在变量不应更改的地方优先使用val——这可以防止意外修改,并使代码更易于理解。
  • 使用val可以让编译器和IDE在编译阶段捕获错误并优化代码。

反向问题。

声明为val的对象可以被修改吗?

答案: 变量本身(引用)的值不能被重新分配,但如果这是一个对象(例如列表),它的内部状态是可以改变的.

val list = mutableListOf(1,2) list.add(3) // 可以!而list = 另一个列表将是错误的.

由于不了解主题的细微差别而导致的实际错误示例。


故事

在一个在线商店项目中,开发者将商品列表定义为val items = mutableListOf<Product>(),认为这样列表是完全不可变的。实际上在另一部分中更改了列表(添加了新元素),意外影响了购物车的展示。


故事

在大文本文件解析器中,数组缓冲区被声明为var buffer,尽管在解析过程中并不需要更换。意外地错误地重新分配新数组,导致内存泄漏和数据处理错误。


故事

在某个微服务的代码中,大多数变量被声明为var "以防万一",最终在大型表达式中对象的状态有时在不同线程中被更改,这导致了由于竞态条件而产生的难以发现的错误。