2010-12-08 148 views
3

可能重複:
val and object inside a scala class?斯卡拉對象作爲字段

有之間的實質性區別:

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

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

與對象字段有關的類是什麼意思?他們用於什麼?有沒有必要使用對象的情況?

謝謝...

+1

可能的重複http://stackoverflow.com/questions/3448691/val-and-object-inside-a-scala-class – 2010-12-08 21:09:08

回答

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.startDatefoo.startDate.type,並向foo.startDate.isBusinessDay方法的調用將被靜態地解決。

另一方面,bar.startDate的類型是結構類型java.util.Date{ def isBusinessDay: Boolean }。因此bar.startDate.isBusinessDay的調用將使用反射並導致不必要的運行時間開銷。

2

那些行爲基本上是一樣的。我曾假設class X { object Y ... }只會提供X.Y的命名空間。我使用Y來存儲(恆定)與X相關的效用數據,因爲我預計有一個獨特的X.Y。實際上,我爲每個新的X構建了一個新對象,我在進行內存分析時發現了這個新對象。

5

兩個區別,一個重要,一個微妙。首先,物體懶惰地發起。出於你的目的,這意味着你的第二個例子應該是

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

他們的行爲等同。更巧妙的是,每個對象都有自己獨特的類型。在你的例子中,timestamp的類型爲Foo.timestamp.type。這通常在實踐中並不重要,但如果您正在以反射方式訪問對象,則可能會導致意外。

+0

採摘點點,是不是在這種情況下,在任何情況下,時間戳有一個獨特的類型,但在對象情況下,類型是可預測的,而在val情況下它是一種匿名類型? – 2010-12-08 21:29:50

+0

好吧,看看你的其他答案,看起來我們看到對象字段的原因是源於懶惰val之前的代碼。我會說懶惰的val幾乎總是首選。 – 2010-12-08 21:33:13