Scalaでobjectを実行時初期化する方法
Q&A
Closed
scalaでシングルトンオブジェクトを初期化する方法がわからず、ご相談させてください。
例えばSample.xxx
とアクセスすると、初回アクセスのみxxx
の初期化処理が走り、その後は初期化済みの値が読み込めるようにしたいです。
例えば、Javaと同じように、シングルトンではなくコンパニオンオブジェクトを経由させて、privateコンストラクタとsingleton用フィールドを使えば、以下のように実現が可能でした。
class Sample private (val xxx: Int, val yyy: Int) {
}
object Sample {
val singleton: Sample = {
val zzz: Int = //実行時に決定する値
val xxx = if (zzz > 0) 1 else 0;
val yyy = if (zzz > 10) 1 else 0;
new Sample(xxx, yyy)
}
}
しかし、この場合はSample.singleton.xxx
という形でアクセスする必要があります。
scalaにはせっかくobjectがあるので、Sample.xxx
とアクセスしたいのですが、実現方法がわかりませんでした。
もちろん、以下のような実装は可能ですが、コード量が増え、あまりキレイでないので、scalaならもっと良い方法があるのではないかと思っています。
var initialized = false
var _xxx
def xxx() {
if(!initialized) {
initialized = true
_xxx = //初期化
}
_xxx
}
何か思いつく方法はありますでしょうか。
0