在kotlin中如何使用像java中的static

在 Kotlin 中,没有直接的 static 关键字,但有几种等效的方式来实现 Java 中静态成员的功能:

1. 伴生对象 (Companion Object) - 最常用

kotlin 复制代码
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)

在文件顶层直接定义,不需要类包装:

kotlin 复制代码
// 在 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) - 单例模式

kotlin 复制代码
object StringUtils {
    // 静态方法
    fun isEmpty(str: String?): Boolean {
        return str.isNullOrEmpty()
    }
    
    // 静态常量
    const val EMPTY_STRING = ""
}

// 使用方式
val isEmpty = StringUtils.isEmpty("test")

4. @JvmStatic 注解

与伴生对象结合使用,确保在 Java 代码中也能像静态方法一样调用:

kotlin 复制代码
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 声明
kotlin 复制代码
// 推荐的综合示例
class AppConfig {
    companion object {
        const val VERSION = "1.0.0"
        
        @JvmStatic
        fun getDefaultConfig(): Map<String, Any> {
            return mapOf("timeout" to 5000, "retries" to 3)
        }
    }
}
相关推荐
alexhilton11 小时前
Jetpack Compose元球边缘效果
android·kotlin·android jetpack
Kiri霧15 小时前
Kotlin递归
android·开发语言·kotlin
普通网友15 小时前
Android开发:使用Kotlin+协程+自定义注解+Retrofit的网络框架
android·kotlin·retrofit
常利兵15 小时前
Kotlin抽象类与接口:相爱相杀的编程“CP”
android·开发语言·kotlin
Arkerman_Liwei15 小时前
Android 新开发模式深度实践:Kotlin + 协程 + Flow+MVVM
android·开发语言·kotlin
蹦哒15 小时前
Kotlin DSL 风格编程详解
android·开发语言·kotlin
JJay.1 天前
Kotlin 高阶函数学习指南
android·开发语言·kotlin
android_cai_niao1 天前
kotlin中的when
kotlin·when
渔舟小调1 天前
后端框架选型:为什么选Kotlin + Spring Boot
kotlin·idea
jinanwuhuaguo1 天前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin