2010-12-08 100 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