如何在Kotlin中定义一个可空的委托成员?

时间:2017-07-20 12:21:03

标签: java kotlin kotlin-null-safety

我需要在Java中装饰一个实例,并希望代表团能够在Kotlin(更容易)。

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

如何定义inner以便能够接收空?

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

Java的使用示例:

new ConnectionDecorator(null).close();

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

2 个答案:

答案 0 :(得分:1)

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

//                             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,它没有意义,因为当你使用委托时,你还需要覆盖一些方法来提供额外的操作,例如:log。您可以直接使用wrap方法,例如:

val connection:Connection? = null;

wrap(connection).close()

您应该inner不可空并按ConnectionDecorator创建wrap个实例,例如:

//                                        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()

答案 1 :(得分:0)

试试这个

ConnectionDecorator(空).close();

open class ConnectionDecorator(var inner:Connection?):内连接!!

希望它的工作