在 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 中更像静态方法@JvmStaticfun 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 formatMessagefun 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 {@JvmStaticfun add(a: Int, b: Int): Int = a + b@JvmStaticval 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"@JvmStaticfun getDefaultConfig(): Map<String, Any> {return mapOf("timeout" to 5000, "retries" to 3)}}
}