scala对象作为字段

时间:2010-12-08 21:01:06

标签: scala

  

可能重复:
  val and object inside a scala class?

是否存在实质性差异:

class Foo {
  object timestamp extends java.util.Date
}

class Foo {
  val timestamp = new java.util.Date {}
}

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

...谢谢

3 个答案:

答案 0 :(得分:6)

如果您需要向字段添加行为,则最好使用object。例如:

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

class Bar {
   lazy val startDate = new java.util.Date {
      def isBusinessDay: Boolean = // ...
   }
}

foo.startDate的类型为foo.startDate.type,对foo.startDate.isBusinessDay方法的调用将以静态方式解析。

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

答案 1 :(得分:5)

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

class Foo {
  lazy val timestamp = new java.util.Date {}
}

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

答案 2 :(得分:2)

那些行为基本相同。我假设class X { object Y ... }只会为X.Y提供一个名称空间。我使用Y来存储(常量)与X相关的实用程序数据,因为我期望一个唯一的X.Y。实际上,为进行内存分析时发现的每个新X构建了一个新对象。