Kotlin的JvmStatic:让Java同事终于能愉快调用我的代码

avatar
莫雨IP属地:上海
02026-02-16:22:37:37字数 2018阅读 0

上周在团队群里,Java老哥@我:“兄弟,你写的Kotlin工具类,我调用的时候总报错,是不是写错了?”
我点开他的代码——DateUtils.formatDate(date)
我:???
然后我翻出自己写的Kotlin类,发现确实没加@JvmStatic
当时真想把键盘砸了:Kotlin的companion object在Java里根本不是静态方法,得写成DateUtils.Companion.formatDate(date)
Java同事要写这么长,能不骂人吗?


为什么Java调用Kotlin总踩坑?

Kotlin没有static,所有“静态”方法都藏在companion object里。
比如我写的日期工具类:

object DateUtils {
    fun formatDate(date: Date): String {
        return SimpleDateFormat("yyyy-MM-dd").format(date)
    }
}

在Kotlin里调用:
DateUtils.formatDate(Date())
在Java里调用:
DateUtils.Companion.formatDate(new Date()) ❌(Java同事:这写法谁受得了?)


JvmStatic:一招解决Java调用痛点

加个@JvmStatic,Java就能直接调用成静态方法:

object DateUtils {
    @JvmStatic // 关键注解!
    fun formatDate(date: Date): String {
        return SimpleDateFormat("yyyy-MM-dd").format(date)
    }
}

Java调用直接变成
DateUtils.formatDate(new Date())
(Java同事秒懂:这不就是Java的写法吗?)


我踩过的坑:别让注解成“隐藏彩蛋”

第一次写这个工具类时,我忘了加@JvmStatic
Java同事在项目里写了DateUtils.formatDate,编译直接报错:
cannot find symbol: method formatDate()

我花了20分钟才定位到是注解问题。
血泪教训

  • 如果Kotlin类会被Java调用,必须加@JvmStatic
  • 如果是纯Kotlin项目?不用管,但混合项目别想省事。

别被“Kotlin优雅”骗了

网上总说Kotlin“没有静态方法,更安全”。
但现实是:Java团队天天在Kotlin代码里写.Companion,代码可读性直接崩了
我后来在团队里统一要求:

“所有被Java调用的工具类方法,必须加@JvmStatic。”

结果呢?

  • Java同事写代码速度提了30%(不用写Companion了)
  • 代码库里的.Companion调用少了80%
  • 甚至有Java同事私聊我:“这Kotlin注解真香,下次你写工具类记得加啊!”

什么时候该用?什么时候不该用?

场景用不用@JvmStatic为啥?
纯Kotlin项目❌ 不用没人用Java调用,多此一举
Kotlin+Java混合项目✅ 必须加让Java调用像调用Java方法一样
被第三方库调用✅ 加防止别人踩坑

最后:不是魔法,是尊重

我写Kotlin工具类时,以前总想“炫技”——把所有方法都写在companion object里。
后来发现,真正的优雅不是让Kotlin更“Kotlin”,而是让协作更顺畅

@JvmStatic不是妥协,是给Java同事省事。
上周那个Java老哥在群里发了个“👍”,说:“终于不用在Kotlin类里写Companion了。”

所以记住

如果你的Kotlin代码要被Java用,
别犹豫,加@JvmStatic
(别问,问就是踩过坑,真香。)

(附:下次你写工具类,记得在方法上加@JvmStatic——不是为了Kotlin,是为了让团队别吵架。)

总资产 0
暂无其他文章

热门文章

暂无热门文章