我有一些代码如下:
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完全不同。有谁知道初始化实例字段的正确方法是什么,这需要一些方法来计算值?
答案 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