尝试提供如下重载的构造函数时
case class Neuron(weight: Double, tHold: Double, var isFired: Boolean, inputNeuron: List[Neuron], id: String) {
def this() = this(0 , 0 , false , List() , "")
}
val n1 = Neuron()
causes compile time error : not enough arguments for method apply: (weight: Double, tHold: Double, isFired: Boolean, inputNeuron:
所以我需要使用:
val n1 = new Neuron()
但是如果我删除重载的“this”引用,我可以在不使用“new”的情况下调用构造函数:
case class Neuron(weight: Double, tHold: Double, var isFired: Boolean, inputNeuron: List[Neuron], id: String)
val n = Neuron(0.0,0.0,false,List(),"")
为什么我需要在上面的场景中使用“new”,为什么只有在使用重载的构造函数时才需要“new”?
答案 0 :(得分:4)
有人可能会争论是否应该将其他构造函数传播到随播对象的apply方法(Neuron()
是什么)。赞成:它更容易。反对:额外的开销,如果你想要的只是额外的应用方法,最好只是把它粘在同伴身上。
说到这个,你真的想要另一个构造函数,还是会这样做?
case class Neuron(w: Double, tH: Double, var fired: Boolean, in: List[Neuron], id: String)
object Neuron {
def apply() = new Neuron(0, 0, false, Nil, "")
}
new
- 通过伴侣对象进行较少的访问通常是获取新实例的更便捷方式。
答案 1 :(得分:2)
当您不使用new
时,它会搜索apply
方法(随播对象),这显然不是构造函数。
如果要定位构造函数,则必须使用new
。
但是如果我删除重载的“this”引用,我可以在不使用“new”的情况下调用构造函数
请注意,您在OP中提出的这一点是错误的
事实上,即使 超载this
,您仍然可以拨打此电话:
Neuron(0.0,0.0,false,List(),"") //still apply() called
它是完全独立的。