Как определить член делегата с нулевым значением в Kotlin?

Мне нужно оформить экземпляр на Java и хотелось бы, чтобы делегирование было в Котлине (проще).

Проблема в том, что я получаю ошибку компиляции определения.

Как я могу определить inner, чтобы иметь возможность получать null?

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

Пример использования из Java:

new ConnectionDecorator(null).close();

* Это упрощенный пример попытки использовать делегирование Kotlin в Java, где передаваемое содержимое может быть нулевым.


person AlikElzin-kilaka    schedule 20.07.2017    source источник
comment
В Котлине проще, но вы не можете заставить его работать? ;)   -  person Michael    schedule 20.07.2017
comment
:) Проще, потому что не нужно переопределять все методы интерфейса и делегировать их внутреннему экземпляру.   -  person AlikElzin-kilaka    schedule 23.07.2017


Ответы (2)


Вы можете указать Пустой объект подключения, если inner имеет значение null, например:

//                             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()
person holi-java    schedule 20.07.2017
comment
TODO("create a Null Object") - как создать нулевой объект? - person AlikElzin-kilaka; 20.07.2017
comment
@AlikElzin-kilaka реализует все методы Connection с пустым телом или возвращает a default value этого метода. - person holi-java; 20.07.2017
comment
@AlikElzin-kilaka, сэр, я плохо разбираюсь в английском, вы можете легко предоставить Null Object с помощью утилит-заглушек в java. - person holi-java; 20.07.2017

Попробуй это

ConnectionDecorator(null).close();

открытый класс ConnectionDecorator (внутренняя переменная: Connection?): Соединение по внутреннему!!

Надеюсь, это работает

person MehulGohil    schedule 20.07.2017