在Kotlin中存在以下可见性修饰符:
public(默认):元素在任何地方可见。internal:元素在一个模块内部可见(如jar/gradle模块等)。protected:仅在类内部及其子类中可见。private:仅在文件或类的范围内可见。特点:
private限制了文件范围内的访问,internal限制在模块内,而public/protected在类外没有意义。private仅在该类内部,protected还包括子类,internal和public的规则与上述相同。class MyClass { private val secret = "hidden" protected val id = 42 internal fun foo() {} public fun bar() {} } internal fun moduleFunc() {} private fun fileOnlyFunc() {}
"顶级函数可以是protected吗?如果可以——它是如何工作的?如果不可以——为什么?"
答案: 不可以,顶级函数不能是protected,因为没有归属于该访问级别的类。编译器会负责这一点——会出现编译错误。
protected fun magic() {} // 错误:protected修饰符不允许用于顶级函数
故事
在fintech应用中,忘记了internal修饰符会为模块中的所有元素提供访问权限。因此,在重构过程中,将部分逻辑移到另一个gradle模块后,数据访问停止工作,但开发人员并未立即注意到,因为在旧测试中编译时没有错误。
故事
在多平台项目中,将敏感数据定义为伴生对象中的private属性。结果,这些数据被序列化并通过反射可用,因为它们被声明为val而没有使用限制导出的注解。
故事
在移动项目启动时,使用private进行顶级函数的定义,以为这会限制合作类的访问。然而,在一个通用的utils文件中,这些函数对所有人可见,导致信息泄漏和在业务逻辑中意外使用的风险。