Kotlin:我如何在Java中使用委托属性?

我知道你不能在Java中使用委托属性语法,也不会像Kotlin那样获得“覆盖”set / get操作符的方便,但是我仍然想使用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

如果您确实想知道Kotlin委托属性在Java中如何看起来如此,那么这里是:在此示例中,java类JavaClass的属性x被委派给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中使用委托属性语法,也不会像Kotlin那样获得“覆盖”set / get操作符的方便,但是我仍然希望在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界面允许你有不同的实现。