DelayedInitの解説:Scala 3で廃止予定の機能(1)

Scala 3 (Dotty 0.26.0-RC1)
最終更新:2020年9月20日

[AD] scalapediaでは記事作成ボランティアを募集しています

この記事では、Scala 3にて廃止される予定のDelayedInitトレイトについて解説します。

DelayedInitは廃止されます

DelayedInitはニッチな用途にしか用いられず、そのわりにいろいろと予想外の挙動を招いていました。

そのため、サポートを続けるほどでもないと判断され、Scala 3からはサポートされなくなることが決定しました。

DelayedInitはオブジェクトの初期化を実行時まで遅らせる機能

そもそもDelayedInitトレイトは、主にAppトレイトを実現するために使用されていました。

DelayedInitトレイトを継承したクラスにおいては、DelayedInitトレイトから継承したdelayedInitメソッドが呼ばれるまで、メンバが初期化されない仕組みとなっていました。

Appトレイトを使用している箇所に注意

DelayedInitトレイトが廃止された結果、DelayedInitを使用していたAppクラスが部分的に壊れてしまいました。

delayedInitメソッドで実行されていたコードは、Scala 3以降はオブジェクトのイニシャライザで実行されるようになったためです。

一部のJVMにおいてはこのコードが解釈されるだけで実行されないことがあるので、2系と同様の挙動を保証できなくなったというわけです。

簡潔にメインプログラムを作成したいという目的においては引き続きAppを使用することはできますが、ベンチマークなどの用途には使用しないようにしましょう。

また、コマンドライン引数にアクセスしたい場合は、mainメソッドを明示的に定義して使用しましょう。

object Hello { def main(args: Array[String]) = println(s"Hello, ${args(0)}") }

代替案は用意されていない

DelayedInitの廃止に対する代替案はまだ用意されていません。

類似の機能が強く必要とされる場合には、本家にリクエストするとよいでしょう。

移行について

Scala 3.0にはDelayedInitは実装されませんでした。

したがって、Scala 3.0へのアップデートの前に、DelayedInitへの依存を取り除く必要があります。

外部リンク:Dropped: Delayedinit

サイト内検索