2016-07-26 6 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 и на инициализацию вопрос я хочу, чтобы захватить его и положить упрощенное представление о нем в базы данных, а затем вернуть его в код, как обычно. Цель состоит в том, чтобы только поместить его в базу данных после того, как все поля в дочернем классе были инициализированы, а также нужно только написать этот код в AbstractIssue и Issue, чтобы избежать поиска всех существующих дочерних элементов Issue.

Моя кишка реакция на эту проблему, чтобы добавить это к абстрактному конструктору:

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

К сожалению, это ужасный способ сделать это, и я изо всех сил, чтобы придумать с чистым раствором. У кого-нибудь есть идеи?

+0

Авось DelayedInit, который позволяет вам делать то, что вам нравится с инициализаторе. Возможно, вам нужен трюк, чтобы знать, когда ваш объект готов. –

+0

К сожалению, DelayedInit устарел AFAIK. Но да, если я смогу найти способ сообщить, когда все необходимые поля готовы, я мог бы просто сделать Будущее, которое ждет до тех пор. – Ophirr

+0

Вы можете заставить 'toSimpleView' возвращать тип' Future' типа 'def toSimpleView: Task [ ???] 'или' def toSimpleView: Future [???] '. Метод (или что-то еще в вашем конкретном классе) может затем выполнить обещание, когда он был полностью инициализирован. Тем не менее, это выглядит очень плохой дизайн! Пожалуйста, подумайте над перемещением 'InsertIssue' вне« AbstractIssue »и пусть тот, кто ответственен за создание проблем, решает, хочет ли он поместить их в БД. – 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()) 
} 
Смежные вопросы