是否存在实质性差异:
class Foo {
object timestamp extends java.util.Date
}
和
class Foo {
val timestamp = new java.util.Date {}
}
拥有一个带有对象字段的类真正意味着什么?它们用于什么?是否有必须使用对象的情况?
...谢谢
答案 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
构建了一个新对象。