作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道您不能在 Java 中使用委托(delegate)属性语法,也不会像在 Kotlin 中那样享受“覆盖”set/get 运算符的便利,但我仍然想使用现有的属性委托(delegate)在 Java 中。
例如,一个简单的 int 委托(delegate):
class IntDelegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>) = 0
}
当然,在 Kotlin 中我们可以这样使用它:
val x by IntDelegate()
但是我们如何在 Java 中以某种形式使用 IntDelegate
呢?这是开始,我相信:
final IntDelegate x = new IntDelegate();
然后直接使用函数。但是如何使用 getValue
函数呢?我为它的参数传递什么?如何获取 Java 字段的 KProperty
?
最佳答案
如果你真的想知道 Kotlin 委托(delegate)属性在 Java 中是怎样的,这里是:在这个例子中,java 类 JavaClass
的属性 x
是委托(delegate)给 Delegates.notNull
标准委托(delegate)。
// delegation implementation details
import kotlin.jvm.JvmClassMappingKt;
import kotlin.jvm.internal.MutablePropertyReference1Impl;
import kotlin.jvm.internal.Reflection;
import kotlin.reflect.KProperty1;
// notNull property delegate from stdlib
import kotlin.properties.Delegates;
import kotlin.properties.ReadWriteProperty;
class JavaClass {
private final ReadWriteProperty<Object, String> x_delegate = Delegates.INSTANCE.notNull();
private final static KProperty1 x_property = Reflection.mutableProperty1(
new MutablePropertyReference1Impl(
JvmClassMappingKt.getKotlinClass(JavaClass.class), "x", "<no_signature>"));
public String getX() {
return x_delegate.getValue(this, x_property);
}
public void setX(String value) {
x_delegate.setValue(this, x_property, value);
}
}
class Usage {
public static void main(String[] args) {
JavaClass instance = new JavaClass();
instance.setX("new value");
System.out.println(instance.getX());
}
}
但是我不建议使用此解决方案,不仅因为需要样板,还因为它在很大程度上依赖于委托(delegate)属性和 kotlin 反射的实现细节。
关于java - Kotlin:如何在 Java 中使用委托(delegate)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45155331/
我是一名优秀的程序员,十分优秀!