代码之家  ›  专栏  ›  技术社区  ›  Jire

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

  •  6
  • Jire  · 技术社区  · 7 年前

    例如,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字段?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Ilya    7 年前

    如果您真的想知道Kotlin委托属性在Java中的外观,请看以下内容:在本例中是一个属性 x java类的 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());
        }
    }
    

        2
  •  1
  •   Joshua    7 年前

    我知道不能在Java中使用委托属性语法,也无法像Kotlin那样“重写”set/get运算符,但我仍然希望在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();
    

    推荐文章