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

5

通常通过伴随对象完成(尽管可以将一些表达式作为参数嵌入到第一行调用中,如 @TheTerribleSwiftTomato 所示):

class FooBar(val x: String, val y: String)
object FooBar {
    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(someZ)

请注意,调用时没有new关键字,也没有办法克服这一点。

于 2013-10-01T22:12:51.283 回答
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 回答