在 Kotlin 中,没有直接的 static
关键字,但有几种等效的方式来实现 Java 中静态成员的功能:
1. 伴生对象 (Companion Object) - 最常用
class MyClass {
companion object {
// 静态常量
const val STATIC_CONSTANT = "constant value"
// 静态变量
var staticVariable: Int = 42
// 静态方法
fun staticMethod(): String {
return "This is a static method"
}
// @JvmStatic 注解使其在 Java 中更像静态方法
@JvmStatic
fun jvmStaticMethod(): String {
return "This appears as static in Java"
}
}
}
// 使用方式
val constant = MyClass.STATIC_CONSTANT
val variable = MyClass.staticVariable
val result = MyClass.staticMethod()
2. 包级函数和属性 (Top-level Declarations)
在文件顶层直接定义,不需要类包装:
// 在 Utils.kt 文件中
// 包级常量
const val APP_NAME = "MyApp"
// 包级变量
var globalCounter = 0
// 包级函数
fun formatMessage(message: String): String {
return "[INFO] $message"
}
// 使用方式(直接导入)
import formatMessage
fun test() {
println(APP_NAME)
globalCounter++
val msg = formatMessage("Hello")
}
3. 对象声明 (Object Declaration) - 单例模式
object StringUtils {
// 静态方法
fun isEmpty(str: String?): Boolean {
return str.isNullOrEmpty()
}
// 静态常量
const val EMPTY_STRING = ""
}
// 使用方式
val isEmpty = StringUtils.isEmpty("test")
4. @JvmStatic 注解
与伴生对象结合使用,确保在 Java 代码中也能像静态方法一样调用:
class MathUtils {
companion object {
@JvmStatic
fun add(a: Int, b: Int): Int = a + b
@JvmStatic
val PI = 3.14159
}
}
// 在 Java 中可以这样调用:
// MathUtils.add(1, 2);
// double pi = MathUtils.PI;
总结对比
Java 方式 | Kotlin 等效方式 | 使用示例 |
---|---|---|
static final 常量 |
const val |
MyClass.CONSTANT |
static 变量 |
伴生对象中的 var |
MyClass.staticVar |
static 方法 |
伴生对象中的函数 | MyClass.staticMethod() |
工具类静态方法 | 包级函数或对象声明 | StringUtils.isEmpty() |
静态初始化块 | init 块在伴生对象中 |
companion object { init {...} } |
推荐做法
- 常量: 使用
const val
在伴生对象或包级 - 工具方法: 使用包级函数或对象声明
- 需要与 Java 互操作的静态成员: 使用伴生对象 +
@JvmStatic
- 单例: 使用
object
声明
// 推荐的综合示例
class AppConfig {
companion object {
const val VERSION = "1.0.0"
@JvmStatic
fun getDefaultConfig(): Map<String, Any> {
return mapOf("timeout" to 5000, "retries" to 3)
}
}
}