先行初期化:Scala 3で廃止予定の機能(9)

Scala 3.3.1
最終更新:2020年9月20日

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

この記事では、Scala 3で廃止された「先行初期化(Early Initializer)」について解説します。

先行初期化は廃止されます

先行初期化とは、クラスを継承する際に以下のような記述を行うことでした。

class Y extends { ... } with X ...

この機能は削除されました。

そもそもほとんど使われていませんでしたが、解決したかった課題はScala 3で導入された新機能「トレイトパラメータ」によって完全に解決しました。

もともと何がしたかったのか

Scala 2においては、トレイトパラメータが無かったので、以下のような工夫をする必要がありました。

例えば以下のようなコードにおいて、Xの初期化に先んじて変数nameを初期化することができました。

abstract class X { val name: String val greet: String = "Hello, " + name } class Y extends { val name: String = "Bob" } with X ...

ちなみに、以下のようなコードはNullPointerExceptionが発生します。

nameが初期化される前にXの初期化に伴いgreetnameを呼び出すためです。

class Y extends X { val name: String = "Bob" } ...

移行について

先行初期化はScala 2において非推奨となっています。

また、先行初期化はScala 3.0ではコンパイルエラーとなります。

いっぺんに移行するのが難しい場合は、一時的にabstract classを定義する方法が提案されています。

外部リンク:Dropped: Early Initializers

サイト内検索