Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

val or object for immutable, final singleton object

Which solution should be generally preferred, considering that the change is source compatible?

This

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

or this?

object Foo {
  object Bar extends Baz(42, "The answer", true)
}
like image 972
soc Avatar asked May 25 '11 13:05

soc


2 Answers

The functional difference between the two constructs is that object Bar is only created when it is needed, while val Bar is created as soon as object Foo is used. As a practical matter, this means you should use the object (or lazy val) if the right-hand side is expensive and won't always be needed. Otherwise, val is probably simpler.

Also, note that if the class Baz is final, you won't be able to use the object style since you can't extend Baz (though you can still use lazy val if you want to defer creation until it's needed).

like image 89
Rex Kerr Avatar answered Oct 22 '22 04:10

Rex Kerr


I say the first since in the second, you are creating a new class but don't add any information (no overriding of methods, values or new ones).

like image 2
IttayD Avatar answered Oct 22 '22 06:10

IttayD