在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)
        }
    }
}
相关推荐
星霜笔记6 小时前
GitMob — 手机端 GitHub 管理工具
android·kotlin·github·android jetpack
android_cai_niao9 小时前
OkHttp 使用教程:从入门到精通(Kotlin)
okhttp·kotlin
Yang-Never1 天前
OpenGL ES ->YUV图像基础知识
android·java·开发语言·kotlin·android studio
idealzouhu1 天前
【Kotlin】 数据流完全指南:冷流、热流与 Android 实战
android·开发语言·kotlin
常利兵1 天前
Android 字体字重设置:从XML到Kotlin的奇妙之旅
android·xml·kotlin
idealzouhu1 天前
【Kotlin】快速理解协程
kotlin
hnlgzb1 天前
Gemini:kotlin这几个类型有什么区别?类比java的文件,是怎样的?
java·开发语言·kotlin
hnlgzb1 天前
kotlin安卓app中,当一个类继承ViewModel类的时候,这个类是想干什么?
android·开发语言·kotlin
新镜1 天前
【Kotlin】StateFlow / MutableStateFlow只有值不相等时才会发射
kotlin
hnlgzb1 天前
kotlin类 继承android.app.Activity 和androidx.activity.ComponentActivity 有什么区别?
android·kotlin·androidx