¿Cómo definir un miembro delegado que se puede anotar en Kotlin?

Necesito decorar una instancia en Java y me gustaría que la delegación esté en Kotlin (más fácil).

El problema es que obtengo un error de compilation en la definición.

¿Cómo puedo definir inner para poder recibir null?

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

Ejemplo de uso de Java:

 new ConnectionDecorator(null).close(); 

* Este es un ejemplo simplificado, tratando de usar la delegación de Kotlin en Java, donde el contenido aprobado puede ser nulo.

Puede proporcionar un object de connection nulo si el inner es nulo, por ejemplo:

 // 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 } 

De hecho, no hay necesidad de tal ConnectionDecorator , no tiene sentido, porque cuando usa la delegación también necesita replace algunos methods para proporcionar operaciones adicionales, por ejemplo: log . puede usar el método de wrap directamente, por ejemplo:

 val connection:Connection? = null; wrap(connection).close() 

Debe hacer que la parte inner no se pueda nulos y cree una instancia de ConnectionDecorator mediante wrap , por ejemplo:

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

Prueba esto

ConnectionDecorator (null) .close ();

class abierta ConnectionDecorator (var inner: ¿Conexión?): ¡Conexión interna!

Espero su trabajo

  • Cómo implementar lateinit correctamente con objects de class personalizados para usar en onCreate () en Android evitando el error 'Property getter or setter expected'
  • Confundido acerca de la security nula en Kotlin
  • ¿Por qué la llamada insegura .run () funciona bien en un valor nulo en Kotlin?
  • Requerir en la superclass 'init block plantea IllegalArgumentException
  • Afirmación no nula de Kotlin en nulo
  • Excepción del puntero nulo trabajando con Map (Kotlin)
  • Kotlin: No se pueden aplicar dos condicionales a la vez. Verificar con el estilo de function de "cuerpo de retorno".
  • function kotlin devuelve nulo