java - 标记一个 fun/property 仅在 Kotlin/Java 中使用

标签 java kotlin annotations backwards-compatibility

我目前正在编写一个 KOTLIN 类,我喜欢使用 DSL 的可能性,但要向后兼容 JAVA 开发人员。使用 var 时,编译器会自动为 JAVA 创建 getter 和 setter,但不能使用 Builder 样式,因为它们不会返回 this

基本上我喜欢做的是这样的:

class MyClass {
    // for use in KOTLIN only DSL style e.g. MyClass() { offset = 1 }
    var offset: Int? = null

    // for use in JAVA only BUILDER style e.g. new MyClass().withOffset(1)
    fun withOffset(value: Int) = apply { offset = value }
}

在 Kotlin 中我喜欢使用,但不想访问 withOffset 的乐趣:

val myClass = MyClass() { offset = 1 }

在 JAVA 中我喜欢使用,但不想访问自动创建的 setOffsetgetOffset:

MyClass myClass = new MyClass().withOffset(1)

已经可以通过 @JvmName 注释重命名 getter 和 setter,但是是否有注释可以完全隐藏 JAVA 的公共(public)属性,当然反之亦然?

最佳答案

您不能隐藏构造函数,但可以使用 operator fun invoke 创建一个所谓的伪构造函数,您可以在其中使用 @JvmSyntheic注释以将其隐藏在 java 中。

要对 kotlin 隐藏函数,您可以使用 @DeprecatedDeprecationLevel.HIDDEN .

注意:@JvmField将指示编译器不要为您的 var 生成默认的 getter 和 setter

class MyClass {
    @JvmField
    var offset: Int? = null

    @kotlin.Deprecated(message = "JUST FOR JAVA", level = DeprecationLevel.HIDDEN)
    fun withOffset(value: Int) = apply { offset = value }

    companion object {
        @JvmSynthetic
        operator fun invoke(init: MyClass.() -> Unit) = MyClass().apply(init)
    }
}

在 Kotlin 中的用法:

MyClass() { offset = 1 }
// or
MyClass { offset = 1 }

Java 中的用法:

MyClass().withOffset(1)

资源:

关于java - 标记一个 fun/property 仅在 Kotlin/Java 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62473203/

相关文章:

java - 如何在不符合 RegEx 格式的输入文本上更改 JFormattedTextField 的前景色/文本颜色?

java - 在嵌套 JPanel 上绘制组件 (Java)

android - getSpans、getSpanStart、getSpanEnd 需要导入什么?

Gradle NamedDomainObject 从未配置过

android - 如何通过自定义列表在房间中创建TypeConverter?

java - 如何使用 Maven 处理注释?

java - 如何将 JUnit 注解码合成自定义注解?

java - Maven 插件注释的 IntelliJ 错误消息

java - 使用分页从redis缓存中检索数据

java - 不可变的java对象