Tag: 代表

Kotlin – 如何使用自定义名称制作地图代理?

我试图让我的头绕着财产代表,我有一个有趣的用例。 有没有可能有这样的事情: class MyClass { val properties = mutableMapOf() val fontSize: Any by MapDelegate(properties, “font-size”) } 这将允许我使用地图作为fontSize存储fontSize ,但使用自定义键(即“font-size”)。 如果用于存储诸如可以通过variables访问的CSS属性标记( fontSize )以用于代码的特定用例,但是在迭代地图( font-size: 18px; )时可以正确呈现。

科特林代表团的expression,而不是固定的参考

假设我有一个非常复杂的规范定义为一个接口: interface Spec { fun sayHello() } 而一个标准的实现: class Impl(private val msg: String) : Spec { override fun sayHello() { println(msg) } } 现在假设我想创建一个实现此规范的类并委托给一个实现,但是确切的委托对象在整个对象的生命周期中都是可变的。 这是一个例子: class Derived(var target: Spec) : Spec by target 上面的例子的问题是构造函数参数target被设置为调用构造函数时的委托对象。 然后代理直接访问,而不是执行属性访问。 (这一点已经通过查看Kotlin生成的字节码得到证实。) 所以,即使在构造类后属性target被修改,委托也不会改变。 任何人都可以提供一种在Kotlin中执行这个委托的方法,而不必写出每一种方法吗? 一个理想的解决方案还允许委派一些像lambda或其他expression式一样的东西,只要在对象的整个生命周期中需要委托,就会被评估和用作委托。

可循环观察的代表

在某些情况下是否有可能规避可观察的代表? 用例: val ls: ArrayList by Delegates.observable(arrayListOf()) { _, _, new -> if (someCondition) { usesList(new) // I want to reset ls to arrayListOf(), but without the invocation of the observable delegate. } }

访问Kotlin的财产代表

Kotlin已经委派了属性,这是一个非常好的function。 但有时get()和set()方法是不够的。 假设我想要Closeable地创建一个Closeable对象并稍后关闭它。 下面是一个如何实现这样的委托属性的例子: fun closeableLazy(initializer: () -> T) = CloseableLazyVal(initializer) class CloseableLazyVal( private val initializer: () -> T ) : ReadOnlyProperty { private var value: T? = null override fun get(thisRef: Any?, desc: PropertyMetadata): T { if (value == null) { value = initializer() } return value } fun close() { value?.close() } } […]

Kotlin:如何访问Delegate的get-和setValue方法?

我一直想知道如何委托属性 (“由”的关键字)的工作。 我通过契约得到了委托(“by”的右边)必须实现一个get和setValue(…)方法,但是怎样才能确保编译器以及如何在运行时访问这些方法呢? 我最初的想法是,很明显,代表们必须实施某种“SuperDelegate” – 接口,但似乎并非如此。 所以剩下的唯一选择就是使用Reflection来访问这些方法,可能在语言本身的低层实现。 我觉得有些奇怪,因为根据我的理解,这将是相当低效的。 此外,reflectionAPI甚至不是stdlib的一部分,这使得它更怪。 我假设后者已经是(部分)答案。 所以让我再问你下面的问题:为什么没有声明getter和setter方法的SuperDelegate-Interface? 那不会更清洁吗? 以下对于这个问题并不重要 所描述的接口甚至已经在ReadOnlyProperty和ReadWriteProperty中定义了。 要决定使用哪一个可以取决于我们是否有val / var。 或者甚至省略,因为在val上调用setValue方法被编译器阻止,只能使用ReadWriteProperty接口作为SuperDelegate。 可以说,当要求代表实现某个接口的时候,构造会变得不那么灵活。 虽然这会假定作为代表使用的类别可能不知道这样使用,但我认为这是不太可能的,因为有必要的方法的具体要求。 如果你仍然坚持,这里有一个疯狂的想法:为什么不甚至使这个类通过扩展实现所需的接口(我知道这是不可能的,但现在,但是,为什么不呢?可能有一个好’为什么不’,请让我知道作为一个旁注)。

如何安全地解决这个空初始化器检查?

我正在写一个测试用例,我需要一些私有属性。 由于这些私人数据是从私人方法生成的,我决定在计算完成后使用reflection来检索它们。 后来我想起了委托的财产,并决定写一个总代表。 这是我到目前为止的代码: fun reflect(instance: Any, initOnce: Boolean = true) = ReflectBackedProperty(initOnce, instance) class ReflectBackedProperty(val initOnce: Boolean, val instance: Any): ReadOnlyProperty { var initialized = false lateinit var cache: T // <— (a) override opertaor fun getValue(thisRef: Any, property: KProperty): Any? { @Suppress(“UNCHECKED_CAST”) if (!initialized || !initOnce) { cache = instance.javaClass.getDeclaredField(property.name).get(instance) as T initialized […]

kotlin委托属性,在get()方法中,我可以如何访问值?

Kotlin已经委派了属性,这是一个非常好的function。 但是我正在弄清楚如何获取和设置值。 假设我想获得委托的财产的价值。 在get()方法中,我可以如何访问该值? 以下是我已经实现的一个例子: class Example() { var p: String by DelegateExample() } class DelegateExample { operator fun getValue(thisRef: Any?, property: KProperty): String { return “${property.name} ” } operator fun setValue(thisRef: Any?, property: KProperty, value: String) { println(“${value.trim()} ‘${property.name.toUpperCase()} ‘”) } } fun delegate(): String { val e = Example() ep = “NEW” return […]

我如何将实现委托给Kotlin中的可变属性?

至于我的理解,在Kotlin中委托一个实现的想法是避免看起来像这样的代码: class MyClass(val delegate : MyInterface) : MyInterface { override fun myAbstractFun1() = delegate.myAbstractFun1() override fun myAbstractFun2() = delegate.myAbstractFun2() // … } 相反,我们可以写下面的代码,它应该这样做: class MyClass(val delegate : MyInterface) : MyInterface by delegate 现在,我想delegate是一个可变的variables,即我的代码如下所示: var delegate : MyInterface = MyImplementation() object MyObject : MyInterface by delegate 所以,如果我像第一个例子一样委托每个抽象方法来delegate自己的delegate那么改变delegate的值确实会改变方法的行为。 但是,上面的代码编译为这个Java代码: public final class MyObject implements MyInterface { public […]

Kotlin var lazy init

我想为一个var属性做一个懒惰的初始化。 由于by lazy只限于val属性,我必须写这样的东西: private var currentContextProvider: ContextProvider? = null get() { if (field == null) { field = DefaultContextProvider() } return field } 现在我必须处理那些毫无意义的可空currentContextProvider?.getContext()知的调用: currentContextProvider?.getContext()或者currentContextProvider!!.getContext() 难道我做错了什么?

Kotlin使用Room persistence lib进行代理

我目前正在开发一个新的Android应用程序使用Kotlin。 我试图实现数据存储的空间,但我没有得到它与科特林代表合作。 我创建了一个Identifier委托,以确保id在初始化后不会被更改。 代表看起来像这样: class Identifier: ReadWriteProperty { private var currentValue = -1L override fun getValue(thisRef: Any?, property: KProperty): Long { if (currentValue == -1L) throw IllegalStateException(“${property.name} is not initialized.”) return currentValue } override fun setValue(thisRef: Any?, property KProperty, value: Long) { if (currentValue != -1L) throw IllegalStateException(“${property.name} can not be changed.”) currentValue = value […]