Kotlin:如何在 Java 中使用委托属性?
Kotlin: How can I use delegated properties in Java?
我知道您不能在 Java 中使用委托 属性 语法,也不会像在 "overriding" 和 set/get 运算符中那样方便Kotlin,但我仍然想在 Java.
中使用现有的 属性 委托
例如,一个简单的 int 委托:
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
?
I know that you can't use the delegated property syntax in Java, and won't get the convenience of "overriding" the set/get operators as in Kotlin, but I'd still like to use an existing property delegate in Java.
没有,就像你开头说的,在Java中是不存在的。但如果你坚持做,你也可以做类似的事情。
public interface Delegate<T> {
T get();
void set(T value);
}
public class IntDelegate implements Delegate<Integer> {
private Integer value = null;
@Override
public void set(Integer value) {
this.value = value;
}
@Override
public Integer get() {
return value;
}
}
final Delegate<Integer> x = new IntDelegate();
接口中的 Delcare x 允许您有不同的实现。
如果您真的想知道 Kotlin 委托 属性 在 Java 中的幕后情况,请看这里:在此示例中,一个 属性 x
java class JavaClass
委托给 Delegates.notNull
标准委托。
// 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());
}
}
但是我不推荐使用这个解决方案,不仅因为需要样板,而且因为它在很大程度上依赖于委托属性和 kotlin 反射的实现细节。
我知道您不能在 Java 中使用委托 属性 语法,也不会像在 "overriding" 和 set/get 运算符中那样方便Kotlin,但我仍然想在 Java.
中使用现有的 属性 委托例如,一个简单的 int 委托:
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
?
I know that you can't use the delegated property syntax in Java, and won't get the convenience of "overriding" the set/get operators as in Kotlin, but I'd still like to use an existing property delegate in Java.
没有,就像你开头说的,在Java中是不存在的。但如果你坚持做,你也可以做类似的事情。
public interface Delegate<T> {
T get();
void set(T value);
}
public class IntDelegate implements Delegate<Integer> {
private Integer value = null;
@Override
public void set(Integer value) {
this.value = value;
}
@Override
public Integer get() {
return value;
}
}
final Delegate<Integer> x = new IntDelegate();
接口中的 Delcare x 允许您有不同的实现。
如果您真的想知道 Kotlin 委托 属性 在 Java 中的幕后情况,请看这里:在此示例中,一个 属性 x
java class JavaClass
委托给 Delegates.notNull
标准委托。
// 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());
}
}
但是我不推荐使用这个解决方案,不仅因为需要样板,而且因为它在很大程度上依赖于委托属性和 kotlin 反射的实现细节。