2017-05-27 2 views
0

Ich benutze das Kotlin Delegationsmuster, um mehrere Komponenten zu größeren Komponenten zu mischen und anzupassen. Das hat meinen Code beschleunigt, es einfacher zu lesen, modularer, konsistenter usw. gemacht. Alle guten Dinge. Eine Sache, mit der ich mich abmühen muss, ist ein gutes Muster, um meine Delegierten freizugeben. Die meisten von ihnen haben eine dispose() Methode, die ich darauf zu achten, verwenden Rx Abonnements abzumelden, Android Lader Cancelling, zur Aussetzung der Ausführung von Aufgaben usw. Derzeit mache ich Sachen wie:Kotlin automatischer Code, der Delegierungsmuster einruft

interface Disposable { 
    fun dispose() 
} 

interface A: Disposable { 
} 

interface B: Disposable { 
} 

class AImpl: A { 
    fun dispose(){} 
} 

class BImpl: B { 
    fun dispose(){} 
} 

class Foo(val a = AImpl(), val b = BImpl(): A by AImpl, B by BImpl { 
    override fun dispose() { 
    a.dispose() 
    b.dispose() 
    } 
} 

manuell auf allen delegierten Methoden aufrufen entsorgen fühlt sich etwas klobig an - gibt es in Kotlin einen eleganten Weg (über Polymorphismus, mehr Delegierung, etc.), um sicherzustellen, dass eine Klasse bestimmte Methoden von Delegierten automatisch aufruft - in diesem Fall sind es Aufreinigungsmethoden, aber die gleichen können auch angewendet werden jede Operation, die alle Delegierten ausführen müssen.

Antwort

0

Ein nützliches Muster wird CompositeDisposable

verwenden So können Sie einige Klasse entlang dieser Linien haben

val disposables: CompositeDisposable 

fun addDisposable(val disposable: Disposable) disposables.add(disposable) end 

fun dispose if (!disposables.isDisposed()) { 
     disposables.dispose(); } end 

Diese besonders von https://github.com/android10/Android-CleanArchitecture inspiriert ist die Basis Anwendungsfall https://github.com/android10/Android-CleanArchitecture/blob/master/domain/src/main/java/com/fernandocejas/android10/sample/domain/interactor/UseCase.java

+0

Hm Kotlin Formatierung nicht toller Stack-Überlauf. – Calin

+0

Ja, ich habe dieses Muster zuvor in Java verwendet und es ist großartig in dieser Umgebung, wenn Sie sich nicht damit beschäftigen, eine statisch typisierte Architektur auszuarbeiten. Aber ich versuche das Kotlin-Delegationsmuster https://kotlinlang.org/docs/reference/delegation.html zu verwenden und es ist nicht möglich, fancy delegation-foo zu machen, wie man es mit Kaitlin-Eigenschaften macht (faule Instantiierung, beobachtbares Muster, etc.)). All diese Dinge erlauben es Ihnen, in die delegierten Objekte einzugreifen, aber wenn Sie Implementierungen von Interfaces delegieren, können Sie nichts davon tun (zumindest habe ich nicht herausgefunden, wie!). – mikesol