2016-07-26 76 views
0

我等待2.12能夠使用onCreate鉤子,但它似乎已被推遲到2.13。有沒有什麼建議可以讓你成爲一個體面的替代品?從本質上說,我有一個特質和抽象類,如下所示:Scala OnCreate替代實現

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

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

,不存在與AbstractIssue的多個不同的實現,以及對一個問題的初始化我想抓住它,並把它簡化表示成一個數據庫,然後像平常一樣將它返回給代碼。目標是僅在子類中的所有字段初始化後纔將其放入數據庫中,並且只需在AbstractIssueIssue中編寫此代碼以避免查找每個現有子代Issue

我的直覺反應,這個問題是把它添加到抽象構造函數:

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

不幸的是,這是做一個可怕的方式,而我努力拿出一個乾淨的解決方案。有沒有人有任何想法?

+0

也許DelayedInit,它可以讓你做什麼你初始化喜歡。也許你需要知道什麼時候你的對象已經足夠準備好了。 –

+0

不幸的是DelayedInit已被棄用AFAIK。但是,是的,如果我可以找到一種方式來表示所有必填字段準備就緒時,我可以創建一個Future,然後等待至此 – Ophirr

+0

您可以使'toSimpleView'返回類似'Future'的類型,例如'def toSimpleView:Task [ ???]或'def toSimpleView:Future [???]'。該方法(或者具體類中的其他方法)可以在完成初始化時完成承諾。雖然它看起來像一個非常糟糕的設計!請考慮移動AbstractIssue外部的'InsertIssue',讓負責創建問題的人決定是否要將它們放入數據庫。 – valenterry

回答

0

我最終什麼事做一劈到的onCreate出來:

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 
} 

然後在抽象類:

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