【发布时间】:2020-09-09 14:07:14
【问题描述】:
我想以一种对 Kotlin 调用者有用但对 Java 调用者有用的方式扩展 API。因此,我想鼓励 Kotlin 用户切换到新方法,而不会打扰 Java 用户。我们有一个混合了 Java 和 Kotlin 的大型代码库,而且短期内不会是 100% Kotlin。
有没有办法添加一个@Deprecate 标签或类似的标签,它只出现在 Kotlin 中,而不是 Java 中?
如果您对具体细节感兴趣,我们有一个Log 接口,它采用格式化字符串,如下所示:
Log.get().info("Log message with some $expensive $things to $format")
该字符串是在每次调用时创建的,即使日志记录被禁用。修复记录器 API 以分别获取格式字符串和参数将是一个巨大且具有破坏性的变化。然而,Kotlin 的可空类型可以为我们提供一个非常便宜的解决方案:
Log.getNullable()?.info("This $expensive $format should be skipped if there's no logger")
只是在所有 Kotlin 代码中将 get(). 替换为 getNullable()?. 的情况。但我不想在 Java 代码中使用getNullable(),因为存在NullPointerException 的风险。所以旧的 Log.get 方法应该在 Kotlin 中被理想地弃用,但在 Java 中不应该被弃用。
【问题讨论】:
-
Log.get()返回什么,这怎么可能为空?您是否只是为了防止调用类中发生某些事情而使其为空? (这似乎有点奇怪) -
Log.get()返回一个Logger对象(但请注意,由于遗留原因,不是标准的java.util.logging.Logger)。它总是返回一个有效的Logger,但在某些构建配置中,日志消息将被丢弃,因此格式化字符串所花费的时间被浪费了。这大多很便宜,但并非总是如此。所以是的,我想返回 null 以停止调用者格式化字符串。 -
能否请您展示当前的
Log是如何实现的?或者它是什么(对象?同伴?)?另外:getNullable现在是如何定义的?