2017-07-20 7 views
0

Je dois décorer une instance en Java et aimerais que la délégation soit à Kotlin (plus facile).Comment définir un membre délégué nullable dans Kotlin?

Le problème est que j'obtiens une erreur de compilation sur la définition.

Comment puis-je définir inner pour pouvoir recevoir null?

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

Exemple d'utilisation de Java:

new ConnectionDecorator(null).close(); 

* Ceci est un exemple simplifié, en essayant d'utiliser la délégation de Kotlin en Java, où le contenu peut être passé nulle.

+0

C'est plus facile à Kotlin mais vous ne pouvez pas le faire fonctionner? ;) – Michael

+0

:) Plus facile en n'ayant pas besoin de surcharger toutes les méthodes d'interface et de déléguer à l'instance interne. –

Répondre

1

Vous pouvez fournir un Null Connection Object si la inner est nulle, par exemple:

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

En fait, il n'y a pas besoin d'un tel ConnectionDecorator, il n'a pas de sens, parce que quand vous vous aussi la délégation à l'aide nécessité de remplacer certaines méthodes pour fournir des opérations supplémentaires, par exemple: log. vous pouvez utiliser wrap méthode directement, par exemple:

val connection:Connection? = null; 

wrap(connection).close() 

Vous devez faire des inner à non annulable et créer ConnectionDecorator exemple par wrap, par exemple:

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

'TODO (" créer un objet nul ")' - comment créer un objet nul? –

+0

@ AlikElzin-kilaka implémente toutes les méthodes de 'Connection' avec un corps vide ou retourne' une valeur par défaut' de cette méthode. –

+0

@ AlikElzin-kilaka monsieur, je ne suis pas bon en anglais, vous pouvez facilement fournir un 'Null Object' par des utilitaires stub en java. –

0

Essayez cette

ConnectionDecorator (null) .close();

classe ouverte ConnectionDecorator (var interne: Connexion?): Connexion par interne !!

Espérer son travail