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

无法在scala中的构造函数之前调用实例方法,scala,Scala,我有如下代码: class Test(var f1 : String) { def this(a : Int) { this(makeStr(a)) } private def makeStr(a : Int): Unit = { "ABC" + a } } 我得到的错误是:未找到:value makeStr scala编译器似乎无法在构造函数中看到makeStr方法。它似乎与Java完全不同,Java是可行的。有谁知道初始化

我有如下代码:

class Test(var f1 : String) {

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

    private def makeStr(a : Int): Unit = {
        "ABC" + a
    }
}
我得到的错误是:
未找到:value makeStr


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

如果我理解正确,您正在尝试创建一个包含多个构造函数的类。在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)

     }
 }

我觉得在这种情况下,最好的解决方案是使用工厂方法,而不是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

有关详细信息,在主构造函数运行之前,不能调用实例方法。您可以将
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)

在伴随对象中定义工厂方法比在其他答案中提到的使用多个构造函数更为惯用。

你没有抓住要点,我说的是在构造函数参数中调用实例方法的能力(即makeStr方法)