2016-07-26 9 views
0

Ich warte auf 2.12 in der Lage sein, die onCreate Haken zu verwenden, aber es scheint, dass es bis 2.13 geschoben wurde. Gibt es irgendwelche Vorschläge für eine gute Alternative? Im Wesentlichen habe ich eine Eigenschaft und eine abstrakte Klasse wie folgt:Scala OnCreate alternative Implementierung

trait Issue { 
    def details: ... 
    def logic: ... 
    def toSimpleView: ... 
} 

abstract class AbstractIssue extends(source: IssueSource) extends Issue{ 
    val extraDetail: ... 
} 

Es existieren mehrere verschiedene Implementierungen des AbstractIssue, und auf die Initialisierung eines Problems will ich es packen und eine vereinfachte Darstellung es ausdrückte in eine Datenbank, und geben Sie sie dann wie gewohnt an den Code zurück. Das Ziel ist, es nur in die Datenbank zu stellen, nachdem alle Felder in der Kindklasse initialisiert wurden, und diesen Code nur in AbstractIssue und Issue schreiben zu müssen, um zu vermeiden, dass jedes existierende Kind aufgespürt wird Issue.

Mein Bauch Reaktion auf dieses Problem ist dies den abstrakte Konstruktor hinzuzufügen:

abstract class AbstractIssue extends(source: IssueSource) extends Issue{ 
    val extraDetail: ... 
    Future { Thread.sleep(2000) }.foreach(_ => InsertIssue(this.toSimpleView)) } 
} 

Leider, das ist eine schreckliche Art und Weise, es zu tun, und ich bin zu kämpfen mit einer sauberen Lösung zu kommen. Hat jemand irgendwelche Ideen?

+0

Vielleicht DelayedInit, die Sie können tun, was Sie mit initializer mögen. Vielleicht brauchst du einen Trick, um zu wissen, wann dein Objekt fertig genug ist. –

+0

Leider DelayedInit ist veraltet AFAIK. Aber ja, wenn ich einen Weg finden kann zu signalisieren, wenn alle erforderlichen Felder bereit sind, könnte ich einfach eine Zukunft machen, die bis dahin wartet. – Ophirr

+0

Man könnte 'toSimpleView' einen' Future'-ähnlichen Typ wie 'def toSimpleView: Task [ ???] 'oder' def toSimpleView: Future [???] '. Die Methode (oder etwas anderes in Ihrer konkreten Klasse) kann dann das Versprechen abschließen, wenn sie vollständig initialisiert wurde. Es scheint jedoch ein * sehr schlechtes * Design zu sein! Ziehen Sie in Betracht, den 'InsertIssue'-Rand des' AbstractIssue' zu ​​verschieben und derjenige, der für das Erstellen von Issues verantwortlich ist, entscheiden zu lassen, ob er sie in DB einfügen möchte. – valenterry

Antwort

0

Was ich am Ende wie ein Hack zu tun, bis onCreate kommt:

def hackToHandleAfterInitialization(handler:IssueHandler):Future[Unit] = { 
import scala.concurrent.blocking 
Future { 
    var continue = true 
    while (continue) { 
    try { 
     blocking(synchronized(handler.handleProblem(this))) 
     continue = false 
    } catch { 
     case un:UninitializedFieldError => 
     Thread.sleep(5) 
     continue = true 
    } 
    } 
    Unit 
} 

Und dann in der abstrakten Klasse:

abstract class AbstractIssue extends(source: IssueSource) extends Issue{ 
    val extraDetail: ... 
    hackTohandleAfterInitialization(DefaultHandler()) 
}