オーバーロードされたコンストラクターに処理ロジックを追加しようとしていますが、機能していないようです。
これが私がやりたいことの簡単な例です:
class FooBar(val x: String, val y: String) {
this(z: String) = {
// DO SOME ARBITRARY CODE
val x = // SOME ARBITRARY PROCESSING USING z
val y = // SOME ARBITRARY PROCESSING USING z
this(x, y)
}
}
ただし、コンパイル エラーが発生します。
: 'this' expected but 'val' found
これは Java での非常に単純なタスクx, y
です。2 つの別個のコンストラクターからインスタンス変数を設定するだけです。
これは、私が達成したいことと同等のJavaです。
class FooBar {
public String x;
public String y;
public FooBar(String x, String y) {
this.x = x;
this.y = y;
}
public FooBar(String z) {
// DO SOME ARBITRARY CODE
this.x = // SOME ARBITRARY PROCESSING USING z
this.y = // SOME ARBITRARY PROCESSING USING z
}
}
=================== 編集 ==================
コンパニオン オブジェクトを使用した @om-nom-nom のアプローチを採用することにしました。ただし、@ om-nom-nom が指摘したように、欠落しているnew
呼び出しを回避する方法はありません。したがって、コンストラクターの一貫性を保つためapply
に、コンパニオン オブジェクトでメソッドをオーバーロードしました。
class FooBar(val x: String, val y: String)
object FooBar {
def apply(x: String, y: String) = new FooBar(x, y)
def apply(z: String) = {
// DO SOME ARBITRARY CODE
val x = // SOME ARBITRARY PROCESSING USING z
val y = // SOME ARBITRARY PROCESSING USING z
new FooBar(x, y)
}
}
FooBar(someX, someY)
FooBar(someZ)