gpt4 book ai didi

java - Kotlin:如何在 Java 中使用委托(delegate)属性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:20:04 26 4
gpt4 key购买 nike

我知道您不能在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com