val или объект для неизменного, окончательного синглтон-объекта - PullRequest
7 голосов
/ 25 мая 2011

Какое решение должно быть в целом предпочтительным, учитывая, что изменение совместимо с источником?

Это

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

или это?

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

Ответы [ 2 ]

8 голосов
/ 25 мая 2011

Функциональное различие между двумя конструкциями заключается в том, что object Bar создается только тогда, когда это необходимо, а val Bar создается, как только используется object Foo. На практике это означает, что вы должны использовать объект (или lazy val), если правая часть дорогая и не всегда будет нужна. В противном случае val, вероятно, проще.

Также обратите внимание, что если класс Baz является окончательным, вы не сможете использовать стиль object, поскольку вы не можете расширить Baz (хотя вы все равно можете использовать lazy val, если хотите отложить создание, пока оно не понадобится).

2 голосов
/ 25 мая 2011

Я говорю первое, поскольку во втором вы создаете новый класс, но не добавляете никакой информации (без переопределения методов, значений или новых).

...