Kotlin: Как я могу использовать делегированные свойства в Java?

Я знаю, что вы не можете использовать делегированный синтаксис свойств в Java и не получите удобства «переопределения» операторов set / get, как в Kotlin, но я все равно хотел бы использовать существующий делегат свойств в Java.

Например, простой делегат int:

class IntDelegate { operator fun getValue(thisRef: Any?, property: KProperty<*>) = 0 } 

Конечно, в Котлине мы можем использовать это так:

 val x by IntDelegate() 

Но как мы можем использовать IntDelegate в некоторой форме на Java? Это начало, я считаю:

 final IntDelegate x = new IntDelegate(); 

И затем используя функции напрямую. Но как я могу использовать функцию getValue ? Что мне передать за его параметры? Как получить поле KProperty для Java?

Если вы действительно хотите знать, как делегированное свойство Kotlin выглядит под капотом на Java, вот оно: в этом примере свойство x класса Java JavaClass делегируется 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 и не получите удобства «переопределения» операторов set / get, как в Kotlin, но я все равно хотел бы использовать существующий делегат свойств в 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 в интерфейсе позволяет вам иметь различную реализацию.