在Kotlin中,可见性修饰符允许控制对声明的访问:类、属性、函数和顶级(文件级)实体。与Java不同,在Java中,修饰符仅在类级别上有效,而在Kotlin中,它们也适用于顶级声明,这对于构建大型项目和库API非常重要。
在Java中,函数或属性在类外没有可见性修饰符——一切都在public(或package-private)类内。在Kotlin中,项目的结构通常不同,函数或属性不在类内,而是在文件中。
Java开发人员常常期望public的默认行为与Java中相同,但在Kotlin中,顶级函数(或属性)在所有模块中都是可见的,除非另有标记。不正确的可见性定义可能会导致公共API的词法污染、内部工具的意外可用性,或者所需的公共函数不可用。
Kotlin中提供以下修饰符:
示例:
// 文件: Foo.kt private fun utilityFun() {} internal val bar: Int = 10 public val baz: Int = 20 // public不是必需的 fun printValue() { println(bar) }
可以对顶级函数使用protected吗?
不可以,protected仅与类/接口的成员相关,顶级元素不支持。
如果声明一个internal的顶级函数,它在其他模块内可见吗?
不可以。它仅在当前jar/Gradle模块中可见。
private类与private顶级函数有什么区别?
示例:
// 文件: Utils.kt private fun helper() { /* ... */ } // 仅在此文件中可见 internal fun useful() { /* ... */ } // 在整个模块中可见
测试工具被声明为public,进而进入artefact,干扰了库的客户端——一切不属于public API的都变得可见。
优点:
缺点:
内部函数被声明为private,可用于模块内部的公共用途的内部工具,只有经过仔细考虑的接口具有public访问权限。
优点:
缺点: