没有参数的Scala构造函数

时间:2011-07-29 14:01:30

标签: scala

我可能在这里遇到一个愚蠢的问题......我似乎无法弄清楚如何在Scala中创建一个没有参数的构造函数。我知道我可以在类体中编写整个东西(特别是因为它是我需要的唯一构造函数),但它感觉不对。

我有什么:

    class Foo {
        //some init code

        //...
    }

我想要什么(但不起作用,因为它希望我先调用另一个构造函数):

    class Foo {
        // The only constructor
        def this() = { 
            //some init code
        }

        //...
    }

4 个答案:

答案 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
        }
}