Kotlin枚举类中参数加val与不加val的区别是什么?
Kotlin枚举类参数加val和不加的核心区别
简单说,两者的本质是是否把构造参数暴露成枚举实例的公开属性:
1. 不加val:只是构造函数的局部参数
这个参数只能在枚举类的内部代码中使用(比如重写toString()、自定义成员函数),外部代码完全访问不到。
举个例子:
enum class PaymentType(paymentName: String) { CASH("现金"), CARD("银行卡"); // 枚举内部可以用这个参数 override fun toString(): String { return "支付方式:$paymentName" } } // 外部这么写会直接编译报错:找不到paymentName这个成员 // println(PaymentType.CASH.paymentName)
2. 加val:变成枚举实例的公开只读属性
加上val后,这个参数会被自动转换成枚举类的公开只读属性,外部代码可以直接通过枚举实例访问它的值,而且因为是val,这个属性不能被修改(符合枚举的不可变特性)。
例子:
enum class PaymentType(val paymentName: String) { CASH("现金"), CARD("银行卡"); } // 外部可以直接读取属性值 println(PaymentType.CASH.paymentName) // 输出:现金
总结
- 如果只是在枚举内部需要用到这个参数(比如用来生成toString的内容),不需要外部访问,就可以不加val;
- 如果需要外部代码通过枚举实例获取这个参数的值,就必须加val(或者var,但枚举属性一般用val,因为枚举实例是固定不变的)。
内容的提问来源于stack exchange,提问作者MrFlavour
相关产品推荐
相关产品推荐

