无法在scala中的构造函数之前调用实例方法

时间:2017-09-27 14:51:18

标签: scala

我有一些代码如下:

class Test(var f1 : String) {

    def this(a : Int) {
        this(makeStr(a))
    }

    private def makeStr(a : Int): Unit = {
        "ABC" + a
    }
}

我得到的错误是:not found: value makeStr

似乎scala编译器无法在构造函数中看到makeStr方法。它似乎与可行的Java完全不同。有谁知道初始化实例字段的正确方法是什么,这需要一些方法来计算值?

3 个答案:

答案 0 :(得分:2)

在主构造函数运行之前,您无法调用实例方法。您可以将makeStr声明为伴随对象中的方法,以便可以在主构造函数之前运行它。同样不是它应该返回String,而不是代码中的Unit

class Test(var f1 : String) {

  def this(a : Int) {
    this(Test.makeStr(a))
  }

  override def toString = s"Test($f1)"
}

object Test{
  private def makeStr(a : Int): String = {
    "ABC" + a
  }
}

new Test(1) //res0: Test = Test(ABC1)

在配对对象中定义工厂方法而不是使用多个构造函数有点惯用,正如其他答案所提到的那样。

答案 1 :(得分:0)

如果我理解正确,您正在尝试创建一个包含多个构造函数的类。在scala中,最佳实践与Java不同。

首先应创建一个类,然后创建其伴随对象,以便实现不同的构造函数。

//your class
class Test(val f1: String)

//its companion object
object Test {

  def apply(f1: String): Test = new Test(f1)

  def apply(f1: Int): Test = new Test("ABC" + f1)

}

您可以通过以下代码简单地测试上面的代码:

object Main {
     def main(args: Array[String]): Unit = {

        val testInt: Test = Test(1)

        val testString: Test = Test("1")

        println(testInt.f1)

        println(testString.f1)

     }
 }

答案 2 :(得分:0)

在这种情况下,我觉得最好的解决方案是使用工厂方法而不是auxi构造函数。

因此,您可以将构造函数私有定义并在随附对象中提供工厂应用方法:

scala> :paste
// Entering paste mode (ctrl-D to finish)

class Test private(var f1 : String)
object Test {
      def apply(i: String) =  new Test(i)
      def apply(s:Int) = new Test(makeStr(s))
      def makeStr(s: Int) = {
      "ABC" + s } }

// Exiting paste mode, now interpreting.

defined class Test
defined object Test

了解更多信息refer