gpt4 book ai didi

java - 我可以将 Kotlin 调用者的方法标记为已弃用,而不是 Java 调用者的方法吗?

转载 作者:行者123 更新时间:2023-11-30 05:56:28 27 4
gpt4 key购买 nike

我想以对 Kotlin 调用者有用但对 Java 调用者有用的方式扩展 API。因此,我想鼓励 Kotlin 用户改用新方法,而不打扰 Java 用户。我们有一个混合了 Java 和 Kotlin 的大型代码库,但短期内不会是 100% Kotlin。

有没有办法添加仅出现在 Kotlin 中而不是 Java 中的 @Deprecate 标记或类似标记?

如果您对具体细节感兴趣,我们有一个 Log 接口(interface),它采用格式化字符串,如下所示:

Log.get().info("将一些$昂贵的$东西记录到$格式的消息")

即使禁用日志记录,该字符串也会在每次调用时创建。修复记录器 API 以分别获取格式字符串和参数将是一个巨大且具有破坏性的更改。然而,Kotlin 的可空类型可以为我们提供一个非常便宜的解决方案:

Log.getNullable()?.info("如果没有记录器,应该跳过这个昂贵的$格式")

只是在所有 Kotlin 代码中将 get(). 替换为 getNullable()?. 的情况。但我不想在 Java 代码中使用 getNullable(),因为存在 NullPointerException 的风险。因此,旧的 Log.get 方法最好在 Kotlin 中被弃用,但在 Java 中则不然。

最佳答案

假设一个类Log,其方法在伴生对象中定义,例如:

class Log {
companion object {
@JvmStatic
fun get() : String = TODO()
@JvmStatic
fun getNullable() : String? = TODO()
}
}

仅删除@JvmStatic怎么样?或者创建一个扩展函数?

fun Log.Companion.getNullable() : String? = TODO()
class Log {
companion object {
@JvmStatic
fun get() : String = TODO()
}
}

扩展函数在 Java 中通常不像在 Kotlin 中那么容易访问。删除 @JvmStatic 或扩展函数都需要在 Java 代码中添加以下内容:Log.Companion.getNullable 而不是 Log.getNullable。 ..也许这对你来说也可以,而不是弃用它。

即使我的猜测不正确,扩展功能也可能满足您的需求。

关于弃用仅适用于 Kotlin 的方法...我认为这行不通,但这里有另一种解决方法。只需重命名该方法并在该方法上使用 @JvmName("get"),例如:

@JvmStatic
@JvmName("get")
fun dont_ever_use_this_method_again_in_Kotlin() : String = TODO()

这将允许来自 Java 的 Log.get,但不允许来自 Kotlin 的。我认为我们可以同意,没有人会在 Kotlin 中调用 Log.dont_ever_use_this_method_again_in_Kotlin,对吗?

关于java - 我可以将 Kotlin 调用者的方法标记为已弃用,而不是 Java 调用者的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53082337/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com