val или объект для неизменного, окончательного синглтон-объекта

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

это

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

или это?

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

2 ответа

Решение

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

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

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

Другие вопросы по тегам