有之间的实质性区别:
class Foo {
object timestamp extends java.util.Date
}
和
class Foo {
val timestamp = new java.util.Date {}
}
与对象字段有关的类是什么意思?他们用于什么?有没有必要使用对象的情况?
谢谢...
有之间的实质性区别:
class Foo {
object timestamp extends java.util.Date
}
和
class Foo {
val timestamp = new java.util.Date {}
}
与对象字段有关的类是什么意思?他们用于什么?有没有必要使用对象的情况?
谢谢...
如果您需要向该字段添加行为,则最好使用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
的调用将使用反射并导致不必要的运行时间开销。
那些行为基本上是一样的。我曾假设class X { object Y ... }
只会提供X.Y
的命名空间。我使用Y
来存储(恒定)与X
相关的效用数据,因为我预计有一个独特的X.Y
。实际上,我为每个新的X
构建了一个新对象,我在进行内存分析时发现了这个新对象。
两个区别,一个重要,一个微妙。首先,物体懒惰地发起。出于你的目的,这意味着你的第二个例子应该是
class Foo {
lazy val timestamp = new java.util.Date {}
}
他们的行为等同。更巧妙的是,每个对象都有自己独特的类型。在你的例子中,timestamp
的类型为Foo.timestamp.type
。这通常在实践中并不重要,但如果您正在以反射方式访问对象,则可能会导致意外。
采摘点点,是不是在这种情况下,在任何情况下,时间戳有一个独特的类型,但在对象情况下,类型是可预测的,而在val情况下它是一种匿名类型? – 2010-12-08 21:29:50
好吧,看看你的其他答案,看起来我们看到对象字段的原因是源于懒惰val之前的代码。我会说懒惰的val几乎总是首选。 – 2010-12-08 21:33:13
可能的重复http://stackoverflow.com/questions/3448691/val-and-object-inside-a-scala-class – 2010-12-08 21:09:08