Создание временного объекта допустимо (по соображениям производительности), если класс этого объекта удовлетворяет нескольким условиям.
Временный класс должен иметь
только final
поля (то есть никаких других полей кроме
final
он иметь не должен). И сам экземпляр этого класса (если не передается напрямую) должен храниться в
final
локальной переменной. Если это условие соблюдено (есть еще незначительные условия), то включается крутейшая оптимизация (кажется, начиная с Java 7, но точно не помню), которая на выходе дает код, практически эквивалентный тому, как если бы все поля этого класса передавались бы в функцию через параметры (никакой объект класса при этом не создается).
Дополнительное условие, требуемое для включения этой оптимизации - код во всех его методах (включая конструктор) не должен вызывать сторонних эффектов (не обращаться к внешним классам, не вызывать new, и др.). Без опыта написания
чистых функций проще всего соблюсти это ограничение, если вообще не создавать никаких методов, кроме конструктора, который только инициализирует поля значениями своих параметров.
Еще одно условие - этот класс должен быть унаследован только от Object и должен запрещать наследование от себя (то есть сам должен быть
final
).
Кстати, в последних версиях версиях Java (7/8) вообще много разных оптимизаций для тех, кто пишет final по умолчанию везде, и убирает только когда это совершенно необходимо.