我试图在重载的构造函数中添加一些处理逻辑,但似乎无法让它工作。
以下是我想要做的简化示例:
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中一个非常简单的任务,我只需从2个独立的构造函数中设置x, y
个实例变量。
这是我的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&#39的方法使用伴侣对象。然而,正如@ 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)
答案 0 :(得分:5)
通常通过伴侣对象完成(虽然可以embed some expression as argument to the first-line-call, as @TheTerribleSwiftTomato shown):
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
关键字,也无法解决此问题。
答案 1 :(得分: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 和 in 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的答案,伴随对象方法通常更易于维护。
否则,只有在您真正遵循该模板并使用var
成员时才能从您的Java模板进行直接转换,例如:
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
}
}