面试题答案
一键面试Kotlin扩展函数的作用域规则
- 局部作用域:扩展函数可以在局部范围内定义,例如在函数内部。这种情况下,扩展函数的作用域仅限于定义它的函数体内部。
- 文件级作用域:在Kotlin文件顶层定义的扩展函数,其作用域为整个文件。
可见性修饰符对扩展函数的影响
- public:这是默认的可见性修饰符。具有
public
可见性的扩展函数在整个项目中都可以访问,只要包含该扩展函数的模块是可访问的。 - private:
private
修饰的扩展函数只能在定义它的文件内部访问。这常用于只在特定文件中使用的辅助扩展函数。 - internal:
internal
修饰的扩展函数在同一个模块内可访问。模块通常是指一组在编译时一起处理的Kotlin文件,比如一个Gradle模块。 - protected:扩展函数不能用
protected
修饰,因为扩展函数不属于类的成员,不存在继承相关的访问控制场景。
在多模块项目中使用其他模块的扩展函数
假设项目有两个模块:moduleA
和moduleB
。在moduleA
中定义扩展函数,在moduleB
中使用它。
1. 在moduleA
中定义扩展函数
在moduleA
的某个Kotlin文件(如StringUtils.kt
)中定义扩展函数:
package com.example.moduleA
public fun String.addSuffix(suffix: String): String {
return this + suffix
}
这里使用public
修饰符,以便其他模块可以访问。如果使用internal
,则只能在moduleA
内部使用。
2. 在moduleB
中使用扩展函数
首先,确保moduleB
依赖moduleA
。如果使用Gradle构建,可以在moduleB
的build.gradle.kts
中添加依赖:
dependencies {
implementation(project(":moduleA"))
}
然后在moduleB
的Kotlin文件中使用该扩展函数:
package com.example.moduleB
fun main() {
val str = "Hello"
val newStr = str.addSuffix(", World!")
println(newStr)
}
这样就可以在moduleB
中成功使用moduleA
定义的扩展函数。