Scala伴侣对象不是单例

时间:2018-04-06 06:31:57

标签: scala singleton companion-object

我有两节课。

class A (name: String) {
}

object A {
}

根据Singleton的定义,我们只能有一个这种类型的对象。但是,我可以使用以下代码创建两个类型A的不同对象。

object B {
   def main(args: Array[String]): Unit = {
     val a = new A("Vinod")
     println(a)

     val b = new A("XYZ")
     println(b)
  }
}

有人可以解释一下,我的理解不正确吗?

4 个答案:

答案 0 :(得分:4)

伴侣对象不是伴侣类的实例。它们甚至不是同一类型。

class A
object A {
  var state = 0
  def update() :Unit = state = state + 1
}

val abc :A = new A   //instance of class A
val xyz :A.type = A  //2nd reference to object A

// both reference the same singleton object
xyz.update()  //res0: Unit = ()
A.state       //res1: Int = 1
abc.state     //Error: value state is not a member of A$A2521.this.A

答案 1 :(得分:4)

object本身 是一个单身人士。它有自己的类,运行时不存在同一类的其他实例。

但是,您在此处描述的模式不同:object A 不是A的实例,除非您使用object A extends A这样做。您可以通过将类A设为A类使其成为类sealed的唯一实例,但几乎在所有情况下都不需要这样做。

如果您真的想要单身模式,请删除class并仅使用object A,其所有成员都将是"静态"就Java而言。

请注意,object A的实际类型可以称为A.type,如果存在类A,则默认情况下与A类型完全无关。同样,A.type 可以成为A的子类型,如果您明确这样做的话。

答案 2 :(得分:0)

伴侣对象可以被认为是类的静态空间。如果你想让A成为单身人士,你可以把它变成一个对象而不是一个类

答案 3 :(得分:0)

BundleTable.EnableOptimizations = false; bundles.Add(new ScriptBundle("~/Scripts/jquery").Include( "~/Scripts/jquery-1.11.2.min.js", "~/Scripts/jquery.ui.min.js" )); bundles.Add(new ScriptBundle("~/Scripts/customscripts").Include( "~/Scripts/BeatPicker.min.js", "~/Scripts/chosen.jquery.js", "~/Scripts/legacy.js", "~/Scripts/custombox.js", "~/Scripts/ion.rangeSlider.js", "~/Scripts/ion.rangeSlider.min.js", "~/Scripts/iCheck/icheck.min.js", // "~/Scripts/jquery.ui.datepicker1.min.js", "~/Scripts/jquery.dataTables.min.js", "~/Scripts/jquery.ui.datepicker.monthyearpicker.js", "~/Scripts/jquery.unobtrusive-ajax.min.js", "~/Scripts/jquery.akordeon.js", "~/Scripts/jquery.autogrow-min.js", "~/Scripts/jquery.corner.js", new A(不是单身人士),而不是class A。您可以轻松检查它:如果删除object A,则class A行将不再编译。

另请注意,new A不是必须单身:它们可以嵌套在类或特征中,在这种情况下,外部类型的每个实例都有一个。