gpt4 book ai didi

java - Kotlin 委托(delegate)给 future

转载 作者:IT老高 更新时间:2023-10-28 13:48:03 27 4
gpt4 key购买 nike

我正在努力学习 Kotlin,而代表既有趣又令人困惑。我有一种情况,在 java 类中,我将采用构造函数 arg,创建 Future(ID 表示另一个系统中的资源)并将 Future 作为实例变量存储。然后“getXXX”会调用 Future.get()

这是一个示例 java 类

public class Example {


private Future<Foo> foo;

public Example(String fooId) {

this.foo = supplyAsync(() -> httpClient.get(fooId));
}

public Foo getFoo() {
return foo.get();
}
}

我没有提供 Kotlin 示例,因为我根本不知道如何构建它。

最佳答案

您可以使用 custom property getters 以直接的方式将您的 Java 代码转换为 Kotlin :

class Example(fooId: Int) {
private val fooFuture = supplyAsync { httpClient.get(fooId) }

val foo: Foo
get() = fooFuture.get()
}

但是 Kotlin 有一个更强大的概念来概括属性行为 -- the property delegates :

class Example {
val foo: Foo by someDelegate
}

在本例中,someDelegate是定义属性 foo 行为的对象.

虽然Future<V>不能在 Kotlin 中用作开箱即用的委托(delegate),您可以通过实现 getValue(thisRef, property) 创建自己的属性委托(delegate)和(对于可变属性)setValue(thisRef, property, value)函数,因此显式提供了在读取(和写入,如果可变)属性时要执行的代码。

这些函数可以是项目类的成员函数,也可以是 extension functions , 适合 Future<V> 的情况.基本上,使用 Future<V>作为属性委托(delegate),您必须定义 getValue(thisRef, value)它的扩展函数,例如:

operator fun <V> Future<V>.getValue(thisRef: Any?, property: KProperty<*>) = get()

这里,委托(delegate)为属性提供的值将简单地取自 Future::get调用,但正确的实现可能应该负责取消和异常处理。为此,您可以包装 Future<V>进入一个也将定义后备值/策略的类,然后在 by 中使用此类的对象.

那么你可以使用Future<V>对象作为您的属性的代表:

class Example(fooId: Int) {
val foo: Foo by supplyAsync { Thread.sleep(2000); fooId }
}

fun main(args: Array<String>) {
val e = Example(123)
println(e.foo)
}

关于java - Kotlin 委托(delegate)给 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40272783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com