Kotlin实现只读getter的正确方式 等效Java私有字段公开getter的写法
问题解答
1. 给出的Kotlin代码是否是符合要求的正确方案?
是正确方案,仅存在一处语法小瑕疵:handleValue方法前缺少Kotlin函数声明必须的fun关键字,修正后即可实现和原Java类完全一致的封装效果:两个属性对外仅支持读取,修改逻辑完全收敛在handleValue方法内部。
2. 是否必须添加private set才能保证属性对外只读安全?
是必须添加。如果不为var属性显式指定private set,Kotlin默认会生成public可见性的setter,外部任意代码都可以直接修改leftPressed、rightPressed的值,完全破坏原Java类的封装约定。添加private set后,setter仅类内部可见,外部只能读取属性值,符合需求。
3. 是否有其他更优的禁止外部修改的实现方式?
存在另一种行业内常用的实现方案:使用下划线前缀的支撑属性(Backing Property),写法如下:
class Input { // 内部私有可写的存储字段 private var _leftPressed = false // 对外暴露的只读视图 val leftPressed: Boolean get() = _leftPressed private var _rightPressed = false val rightPressed: Boolean get() = _rightPressed fun handleValue(event: Event) { if (event.button == 1) { _leftPressed = event.pressed } else if (event.button == 3) { _rightPressed = event.pressed } } }
两种实现方式没有绝对的优劣:
private set写法更简洁,适合简单的内部修改、对外只读的场景- 支撑属性语义更清晰,明确区分了内部存储字段和对外暴露接口,适合需要给属性修改添加额外校验逻辑、或者属性值需要动态计算的场景
可以根据实际业务需求灵活选择。
内容的提问来源于stack exchange,提问作者Thomas S.
相关产品推荐
相关产品推荐

