1

オーバーロードされたコンストラクターに処理ロジックを追加しようとしていますが、機能していないようです。

これが私がやりたいことの簡単な例です:

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)
4

2 に答える 2

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,y);
    }
}

Javaと Scalaでは、コンストラクター呼び出しはオーバーロード コンストラクターの最初のステートメントでなければならないため、これもコンパイルされません。

ただし、次のように、コンストラクター呼び出しの引数値として式を使用することを妨げるものは何もありません。

class FooBar(val x: String, val y: String) {

    def this(z: String) = {
        this({"a"+"b"}, {null})
        // DO SOME MORE ARBITRARY CODE
    }
 }

これは完全にクリーンなコードではないことに注意してください。コンパニオン オブジェクト アプローチは、om-nom-nom の回答によると、一般的に保守が容易です。

それ以外の場合、実際にそのテンプレートに従い、代わりにメンバーを使用する場合にのみ、Java テンプレートからの直接変換が可能です。var

class FooBar() {

    var x: String;
    var y: String;

    def this(x: String, y: String) = {
      this()
      this.x = x
      this.y = y
    }


    def this(z: String) = {
      this()
      // DO SOME ARBITRARY CODE
      this.x = // SOME ARBITRARY PROCESSING USING z
      this.y = // SOME ARBITRARY PROCESSING USING z
    }
 }
于 2013-10-01T22:17:26.657 に答える