标记一个 fun / 属性 仅用于 Kotlin / Java
Mark a fun / property for use in Kotlin / Java only
我目前正在编写 KOTLIN class,我喜欢使用 DSL 的可能性,但要向后兼容 JAVA 开发人员。当使用 var
时,编译器会自动为 JAVA 创建 getter 和 setter,但不能使用生成器样式,因为它们不会返回 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 我喜欢使用,但不想访问自动创建的 setOffset
和 getOffset
:
MyClass myClass = new MyClass().withOffset(1)
已经可以通过 @JvmName
注释重命名 getter 和 setter,但是是否有用于隐藏 public 属性 的注释 JAVA 完全可选当然反之亦然?
在 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);
您不能隐藏构造函数,但您可以使用 operator fun invoke
创建一个所谓的假构造函数,您可以在其中使用 @JvmSyntheic 注释将其从 java 中隐藏。
要对 kotlin 隐藏函数,您可以使用 @Deprecated with DeprecationLevel.HIDDEN。
注意:@JvmField 将指示编译器不为您的 var[=19= 生成默认的 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)
}
}
在科特林中的用法:
MyClass() { offset = 1 }
// or
MyClass { offset = 1 }
在java中的用法:
MyClass().withOffset(1)
资源:
我目前正在编写 KOTLIN class,我喜欢使用 DSL 的可能性,但要向后兼容 JAVA 开发人员。当使用 var
时,编译器会自动为 JAVA 创建 getter 和 setter,但不能使用生成器样式,因为它们不会返回 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 我喜欢使用,但不想访问自动创建的 setOffset
和 getOffset
:
MyClass myClass = new MyClass().withOffset(1)
已经可以通过 @JvmName
注释重命名 getter 和 setter,但是是否有用于隐藏 public 属性 的注释 JAVA 完全可选当然反之亦然?
在 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);
您不能隐藏构造函数,但您可以使用 operator fun invoke
创建一个所谓的假构造函数,您可以在其中使用 @JvmSyntheic 注释将其从 java 中隐藏。
要对 kotlin 隐藏函数,您可以使用 @Deprecated with DeprecationLevel.HIDDEN。
注意:@JvmField 将指示编译器不为您的 var[=19= 生成默认的 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)
}
}
在科特林中的用法:
MyClass() { offset = 1 }
// or
MyClass { offset = 1 }
在java中的用法:
MyClass().withOffset(1)
资源: