问题的历史:
可见性修饰符(visibility modifiers)是Kotlin的一个关键特性,相较于Java进行了继承和改进。它们允许限制对类、函数和属性的访问,从而支持更好的封装和模块化实践。
问题:
不正确使用可见性可能导致架构层次的破坏、实现细节泄露,或者反过来,使类和方法在需要的地方变得无法访问。这些错误往往在太晚的时候才被发现。
解决方案:
Kotlin有四种可见性修饰符:
public — 可以在任何地方访问(默认)internal — 仅在一个模块内部可访问protected — 在类及其子类内部可访问private — 仅在文件、类或对象内部可访问代码示例:
open class Base { private fun onlyBase() {} protected fun baseAndDerived() {} internal fun insideModule() {} public fun anyone() {} } class Derived : Base() { fun test() { baseAndDerived() // 可访问 // onlyBase() — 错误 } }
关键特性:
internal是Kotlin特有的,在Java中不存在private限制了文件的可见性在发布库时,internal修饰符如何工作?
internal隐藏模块内的元素,但如果将库编译为jar/aar,内部元素可以通过反射访问。
类属性的private与顶层函数的private有何不同?
类属性的private仅限制类内可见性,而顶层的private仅限制文件内可见性。
可以将protected修饰符应用于顶层函数吗?
不可以,protected仅适用于类或接口的成员。顶层不允许使用protected——将产生编译错误。
一个大型库将几乎所有API都声明为public,包括工具和助手,结果用户开始依赖实现细节。
优点:
缺点:
仅声明必要的类为public,其余的为internal或private,清晰地划分了可见性级别。
优点:
缺点: