为何使用重载构造函数" new"是必须的?

时间:2014-08-19 21:31:25

标签: scala

尝试提供如下重载的构造函数时

  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”?

2 个答案:

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

它是完全独立的。