我知道你不能在Java中使用委托属性语法,并且不会像在Kotlin中那样"覆盖"set/get运算符,但我仍然希望在Java中使用现有的属性委托.
例如,int的简单委托:
class IntDelegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>) = 0
}
Run Code Online (Sandbox Code Playgroud)
在Kotlin当然我们可以这样使用:
val x by IntDelegate()
Run Code Online (Sandbox Code Playgroud)
但是我们如何IntDelegate在Java中以某种形式使用?这是开始,我相信:
final IntDelegate x = new IntDelegate();
Run Code Online (Sandbox Code Playgroud)
然后直接使用这些功能.但是我该如何使用该getValue功能呢?我的参数是什么?我如何获得KPropertyJava字段?
我的应用程序中有一个带有许多属性的Kotlin类,我想构建的是一种将变量名存储在字典中的方法。字典看起来像这样:
HashMap<String, Pair<Any, Any>>()
Run Code Online (Sandbox Code Playgroud)
这样做的目的是存储对特定属性所做的更改,我将变量的名称存储为键,在对中存储旧值和新值。为了通知更改,我使用观察者模式。因此,每当从属性调用设置器时,都会通知更改并将其存储到字典中。
以下代码导致以下问题:
var person = Person("Harry", 44)
person.age = 45
Run Code Online (Sandbox Code Playgroud)
HashMap("age", (44, 45))
现在,我只是将变量名硬编码为字符串,所以我的问题是:
如何在Kotlin中动态获取变量名?
我在Java中看到了相同的问题:Java思考:如何获取变量的名称?
另外,关于同一主题的其他一些问题声称这是不可能的:获取变量的name属性
我可以理解,不可能获得变量的名称,因为简单的编译器没有该信息,但是我仍然急于查看其他人是否对此问题有任何解决方案。
我是 kotlin 新手,无法弄清楚这个问题。
我有一个不可为 null 的属性,可能会也可能不会使用。因此,我以一种惰性的方式委托它,以便在需要时对其进行初始化。
private val labelAnimator: ObjectAnimator by lazy {
ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f)
}
Run Code Online (Sandbox Code Playgroud)
但是,我还需要在每次访问该对象时设置该对象的一些属性。
fun getLabelAnimator(): ObjectAnimator {
labelAnimator.duration = (if (isFloatingLabelAnimating) 300 else 0).toLong()
return labelAnimator
}
Run Code Online (Sandbox Code Playgroud)
但我无法使用自定义 getter,因为该属性是委托的。我如何以最好的方式实现这一目标?