2011-05-25 33 views
7

考虑到更改是源兼容的,通常应该选择哪个解决方案?对于不可变的最终单件对象的值或对象

object Foo { 
    val Bar = new Baz(42, "The answer", true) 
} 

或那样吗?

object Foo { 
    object Bar extends Baz(42, "The answer", true) 
} 
+0

如果你想在未来以不同的方式模块化你的API,而不需要太多的修改,那么我会说第一个更好......但是由于这个改变是源代码兼容的,你可以保留第二个,直到需要。 – 2011-05-25 13:37:42

+0

可能重复[val和对象在一个scala类?](http://stackoverflow.com/questions/3448691/val-and-object-inside-a-scala-class) – Bergi 2016-05-25 03:59:53

回答

8

两个结构之间的功能差异在于object Bar仅在需要时才创建,而val Bar只要使用object Foo即可创建。实际上,这意味着你应该使用该对象(或lazy val),如果右侧昂贵并且不总是需要的话。否则,val可能更简单。

另外请注意,如果类Baz是决赛,你将无法使用object风格,因为你不能延长Baz(虽然你仍然可以使用lazy val,如果你想,直到它的需要推迟创建) 。

+0

对不起,我不够清楚。我用'final'表示变量Bar不会被重新分配。 'object'的字节码是不是比'lazy val'的代码简单? – soc 2011-05-25 14:06:20

+0

@soc - 是的,'lazy val'是更复杂的代码(和线程安全)。我编辑了我的答案,使我的意思更清晰,就'final'而言。 – 2011-05-25 14:13:20

+0

不应该'对象'也是线程安全的吗? – soc 2011-05-25 14:15:54

2

我说第一,因为在第二,要创建一个新的类,但不添加任何信息(无的方法,值或新的压倒一切)。