scala对象作为字段

Eri*_*o - 3 scala

可能重复:
scala类中的val和对象?

是否存在实质性差异:

class Foo {
  object timestamp extends java.util.Date
}
Run Code Online (Sandbox Code Playgroud)

class Foo {
  val timestamp = new java.util.Date {}
}
Run Code Online (Sandbox Code Playgroud)

拥有一个具有对象字段的类真正意味着什么?它们用于什么?是否有必须使用对象的情况?

谢谢...

Aar*_*rup 6

object如果您需要向字段添加行为,则使用a 可能更为可取.例如:

class Foo {
   object startDate extends java.util.Date {
      def isBusinessDay: Boolean = // ...
   }
}

class Bar {
   lazy val startDate = new java.util.Date {
      def isBusinessDay: Boolean = // ...
   }
}
Run Code Online (Sandbox Code Playgroud)

foo.startDateis 的类型foo.startDate.type,以及对foo.startDate.isBusinessDay方法的调用将被静态解析.

的类型的bar.startDate,在另一方面,是结构类型java.util.Date{ def isBusinessDay: Boolean }.bar.startDate.isBusinessDay因此,调用将使用反射并产生不必要的运行时开销.


Dav*_*ith 5

两个不同,一个重要,一个微妙.首先,对象是懒洋洋地启动的.为了您的目的,这意味着您的第二个例子应该是

class Foo {
  lazy val timestamp = new java.util.Date {}
}
Run Code Online (Sandbox Code Playgroud)

让他们表现得相当.更巧妙的是,每个对象都有自己独特的类型.在您的示例中,timestamp将具有类型Foo.timestamp.type.这通常在实践中并不重要,但如果您反复访问对象,可能会导致意外.