Kotlin入门:可变var变量的使用意义?能否用不可变val替代?
Kotlin 中 var 的设计意义与常见使用误区
你疑惑的核心触发点,本质是入门教程为了演示var重赋值语法,硬凑出来的反面示例存在极强的误导性。
你贴的示例,本来就该用val
这段代码本身存在两个明显问题:
- 语法不严谨:Kotlin的可变变量关键字是小写的
var,示例里写的大写Var根本无法通过编译,是教学过程中的随手笔误 - 场景完全冗余:代码里两次赋值没有任何运行时分支、状态交互的逻辑支撑,第一次赋值的"Hello"没有承载任何实际业务意义,直接被第二次值覆盖。这种无意义的代码在生产环境中完全可以简化为单个
val的初始化,根本不需要用到var。
也就是说,这个示例从根上就不是var的正确使用场景,拿这个场景质疑var的设计必要性,本身就找错了参照对象。
var真正不可替代的使用场景
var的设计初衷从来不是让你“给一个值、立刻再改掉”,而是服务于值无法在声明时一次性确定、会随程序运行过程动态迭代更新的逻辑场景。这类场景硬用val会导致代码极度冗余,甚至完全无法实现功能:
- 累加类计算:比如遍历商品列表算订单总价,初始值是0,需要逐一遍历累加每个商品的金额。这类场景根本没法在声明变量时就把最终值写死成
val,必须用var承载持续变化的计算结果fun calcOrderTotal(items: List<OrderItem>): Int { var total = 0 for (item in items) { total += item.price * item.count } return total } - 跨流程的状态更新:比如App里的当前登录用户状态,初始打开应用时用户还未登录,变量值为null;等用户完成登录、退出登录的操作时,就需要把变量的引用更新成新的状态。这类场景如果用
val,根本实现不了状态的动态切换,因为val要求第一次赋值后就不能修改引用。 - 交互事件的计数统计:比如按钮的累计点击次数、输入框的实时输入内容统计,这类值会随用户的每一次操作持续变化,不存在声明时就能确定的最终值,必须用
var承载。
实际开发中的选择逻辑
判断用var还是val的标准非常简单:
- 如果这个变量的引用,从第一次赋值开始到整个生命周期结束,永远不会发生变化,就优先用
val,能减少意外修改带来的bug - 如果这个变量存在任何需要重新赋值的运行时逻辑(不管是计算累加、状态更新、交互响应),就必须用
var,没必要为了“追求不可变”硬写多份重复的val声明,让代码变得冗长难读
你觉得“示例里用var多此一举”的感受完全合理——因为教程凑出来的这段演示代码本身就是无意义的反面教材,根本不能代表var的真实设计价值。
内容的提问来源于stack exchange,提问作者Alejandro Valero Gálvez
相关产品推荐
相关产品推荐

