簡體   English   中英

標記一個樂趣/財產僅用於 Kotlin / Java

[英]Mark a fun / property for use in Kotlin / Java only

我目前正在寫一個 KOTLIN class 我喜歡使用 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 的公共屬性,當然反之亦然?

您不能隱藏構造函數,但可以使用operator fun invoke創建所謂的假構造函數,您可以在其中使用@JvmSyntheic注釋將其從 java 中隱藏起來。

要從 kotlin 中隱藏 function,您可以將@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)

資源:

在 Kotlin 中不可能做這樣的事情

val myClass = MyClass() { offset = 1 }

但我建議你改為這樣做,在我看來它看起來好多了。

// It's a inline function so there's no runtime overhead.
inline fun buildMyClass(builder: MyClass.() -> Unit): MyClass {
    return MyClass().apply(builder)
}

class MyClass {

    @JvmSynthetic
    var offset: Int? = null
        private set

    fun withOffset(value: Int) = apply { offset = value }
}

所以你可以像下面這樣稱呼它

val myClass = buildMyClass {
   withOffset(0)
}

在 Java 中,它看起來像這樣:

final MyClass myClass = new MyClass().withOffset(0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM