gpt4 book ai didi

java - 如何在 Kotlin 中定义可为 null 的委托(delegate)成员?

转载 作者:行者123 更新时间:2023-12-02 12:32:39 25 4
gpt4 key购买 nike

我需要用 Java 装饰一个实例,并希望委托(delegate)位于 Kotlin 中(更简单)。

问题是我在定义上遇到编译错误。

如何定义 inner 才能接收 null?

open class ConnectionDecorator(var inner: Connection?) : Connection by inner // Getting an error on the right inner

Java 的用法示例:

new ConnectionDecorator(null).close();

* 这是一个简化的示例,尝试在 Java 中使用 Kotlin 的委托(delegate),其中传递的内容可以为 null。

最佳答案

您可以提供 Null Connection Object如果inner为空,例如:

//                             v--- the `var` is unnecessary
open class ConnectionDecorator(var inner: Connection?) : Connection by wrap(inner)


fun wrap(connection: Connection?): Connection = when (connection) {
null -> TODO("create a Null Object")
else -> connection
}

事实上,不需要这样的ConnectionDecorator,它没有意义,因为当你使用委托(delegate)时,你还需要重写一些方法来提供额外的操作,例如:log 。您可以直接使用 wrap 方法,例如:

val connection:Connection? = null;

wrap(connection).close()

您应该将inner设置为不可为空,并通过wrap创建ConnectionDecorator实例,例如:

//                                        v--- make it to non-nullable
open class ConnectionDecorator(var inner: Connection) : Connection by inner {
fun close(){
inner.close();
log.debug("connection is closed");
}
}

val source:Connection? = null;

// v--- wrap the source
val target:Connection = ConnectionDecorator(wrap(source))

target.close()

关于java - 如何在 Kotlin 中定义可为 null 的委托(delegate)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45214551/

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