Actorの初期化をpreStartでやるべきかプライマリコンストラクタでやるべきかは公式ドキュメントに書いてある - akka

akka2.3.13です。

actorの初期化について迷ったのですが公式ドキュメントに書いてあったのでまとめます。

モチベ

Actorのフィールドでなんらかの値を初期化する際に以下のパターンが考えられます。 *1

var foo = _ // varで宣言

override preStart() {
  super.preStart()
  foo = initFoo // ここで初期化
}
val foo = initFoo // valで宣言&初期化

override preStart() {
  super.preStart()
}

最初はアクターのインスタンスが使いまわされるならrestartのときにコンストラクタが呼ばれないこともありそう・・?みたいな事を思って var foo 方式にしていましたがnull safeじゃない点が気になったので簡単に検証しました。

検証

gist.github.com

実行したログをみると、どうもrestartされた際にはプライマリコンストラクタもpreStartもどちらも呼ばれているようです。

公式に書いてあったこと

職場の先輩に公式に書いてあることを教えてもらったので読んでみました。

Actors — Akka Documentation

によると毎回必ず呼ばれるのはむしろプライマリコンストラクタの方で、コードの書き方によってはpreStartの方は呼ばれないこともあるようです。 だいたい意訳な感じのTweetをしたのでご参考まで

*1:公式ドキュメントには初期化メッセージを送る方式もありますがここでは省略します。