2017-07-20 3 views
0

Ich brauche eine Instanz in Java zu dekorieren und würde die Delegation wie in Kotlin (einfacher) zu sein.Wie definiert man ein NULL-fähiges Delegate-Mitglied in Kotlin?

Das Problem ist, dass ich einen Kompilierungsfehler auf die Definition erhalten.

Wie kann ich definieren inner in der Lage sein null zu erhalten?

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

Beispiel für die Verwendung von Java:

new ConnectionDecorator(null).close(); 

* Dies ist ein vereinfachtes Beispiel, versuchen Kotlin Delegation in Java zu verwenden, wo übergeben Inhalt null sein kann.

+0

Es ist "einfacher" in Kotlin, aber Sie können es nicht zur Arbeit bringen? ;) – Michael

+0

:) Einfacher, da nicht alle Interface-Methoden überschrieben und an die innere Instanz delegiert werden müssen. –

Antwort

1

Sie ein Null Connection Object zur Verfügung stellen kann, wenn die inner null ist, zum Beispiel:

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

In der Tat gibt es keine Notwendigkeit ist so ein ConnectionDecorator, macht es keinen Sinn machen, denn wenn man Delegation verwenden Sie auch müssen einige Methoden überschreiben, um zusätzliche Operationen bereitzustellen, z. B .: log.

val connection:Connection? = null; 

wrap(connection).close() 

Sie sollten die inner zu Nicht-Nullable- machen und schaffen ConnectionDecorator weise durch wrap, zum Beispiel: Sie können wrap Methode direkt verwenden, zum Beispiel

//          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 (" create a Null Object ")' - Wie erstelle ich ein Null-Objekt? –

+0

@ AlikElzin-Kilaka implementiert alle Methoden des 'Connection' mit leeren Körper oder Rückgabe' Standard value' dieses Verfahrens. –

+0

@ AlikElzin-Kilaka Sir, bin ich auf Englisch nicht gut, Sie leicht eine 'Null Object' von Stub utils in Java zur Verfügung stellen können. –

0

Diese

Versuchen

ConnectionDecorator (null) .close();

offene Klasse ConnectionDecorator (var Innen: Connection): Verbindung von Innen !!

Hoffe seine Arbeit

Verwandte Themen