在 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)}}
}