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,是为了让团队别吵架。)
