長時間の作業には、スレッドセーフな(不変の)Scalaクラスが必要です。一部のコーナーケースでは、タスクに非常に時間がかかるため、タイムアウトを実装したいと思います。これを不変のクラスに実装するための最良の方法は何ですか?
私の最初の試みは、次のような暗黙のパラメーターを使用することでした。
class Worker(val input: String) {
def start: String = {
implicit val startTimeStamp = new TimeStamp
doSomething1 + doSomething2
}
def doSomething1()(implicit startTimeStamp: TimeStamp): String = { ... }
def doSomething2()(implicit startTimeStamp: TimeStamp): String = {
...
checkTimeout
...
}
}
class TimeStamp { val start = System.currentTimeMillis }
これは機能するはずですが、暗黙のパラメーターを持つボイラープレートコードがまだたくさんあります。doSomething
(実際のコードでは、workerクラスに何百もの深くネストされた関数があります。)Scalaでこれを行うためのより美しい方法はありますか?