有之間的實質性區別:
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