В отношении отложенных значений следует обратить внимание на то, что, хотя они рассчитываются только один раз, каждый доступ к ним защищен двойной проверкой блокировочной оболочки.Это необходимо для предотвращения одновременной инициализации значения двумя разными потоками с веселыми результатами.Теперь двойная проверка блокировки довольно эффективна (теперь, когда она действительно работает в JVM), и в большинстве случаев не потребует блокировки, но требует больше затрат, чем простой доступ к значению.
Дополнительно (инесколько очевидно), кэшируя строковое представление вашего объекта, вы явно торгуете за счет циклов ЦП для возможно значительного увеличения использования памяти.Строки в версии «def» можно собирать мусором, а строки в версии «lazy val» - нет.
Наконец, как всегда в случае с вопросами производительности, основанные на теории гипотезы почти ничего не значат без основанного на фактах сопоставительного анализа.Вы никогда не узнаете наверняка без профилирования, так что можете попробовать и посмотреть.