Когда вы пишете final, вы сообщаете и компилятору, и читателю, что эта переменная установлена один раз, а затем не изменяется.
Компилятор использует его, чтобы убедиться, что вы случайно не переназначили переменную. Если вы сделаете это, это даст ошибку компиляции.
Человек-читатель может использовать его для более быстрого понимания цели кода.
Отсутствие его обычно не приводит к сбою в коде, но если вы хотите, чтобы поле не изменялось, хорошей идеей будет сказать это явно. Также обратите внимание, что иногда финал обязателен, например, при использовании локальных классов:
В дополнение к доступу к полям, определенным содержащим классом, локальные классы могут обращаться к любым локальным переменным, параметрам метода или параметрам исключения, которые находятся в области определения локального метода и объявлены как окончательные.
С другой стороны, могут быть ситуации, когда вы захотите переназначить переменную. Очевидно, что в этом случае вы не должны объявлять его как окончательный.