我可能在这里遇到一个愚蠢的问题......我似乎无法弄清楚如何在Scala中创建一个没有参数的构造函数。我知道我可以在类体中编写整个东西(特别是因为它是我需要的唯一构造函数),但它感觉不对。
我有什么:
class Foo {
//some init code
//...
}
我想要什么(但不起作用,因为它希望我先调用另一个构造函数):
class Foo {
// The only constructor
def this() = {
//some init code
}
//...
}
答案 0 :(得分:20)
Scala中的所有类都有一个主构造函数和一些辅助构造函数(必须遵循主构造函数或其他辅助构造函数)。
在您的情况下,问题在于,在两种情况下,您都将主构造函数定义为不带参数 - 然后在第二种情况下,您尝试定义具有相同签名的辅助构造函数。这不起作用,原因与以下内容无法编译相同:
// Primary constructor takes a String
class Foo(s: String) {
// Auxiliary constructor also takes a String?? (compile error)
def this(a: String) {
this(a)
}
}
这与构造函数是no-args的事实无关;以下编译例如:
class Foo(s: String) {
// alternative no-arg constructor (with different signature from primary)
def this() {
this("Default value from auxiliary constructor")
}
}
特别是,在您的第二个示例中,您的评论“唯一的构造函数”是错误。辅助构造函数始终是主构造函数的辅助构造函数,并且不能是唯一的构造函数。
FWIW,第一个例子是对你开放的唯一选择,但它看起来不错。如果你刚刚开始使用Scala,我相信它会很快开始感觉到正确 - 当有更多惯用的替代品时,避免使用Java式的做事方式很重要。
答案 1 :(得分:11)
对于它的价值,您可以引入额外的范围来“标记”初始化代码。
class Foo {
{
// init code here
}
}
答案 2 :(得分:4)
将init代码放在类体中是获得不带参数的构造函数的唯一方法。我想如果你想要你可以做类似的事情:
class Foo {
private def init {
//init code here
}
init()
}
这就像你要接近的那样。
答案 3 :(得分:4)
初始代码是方法的主体。但是你可以做到这一点,如果它困扰你那么多:
class Foo {
locally {
//some init code
}
}