Преимущество не в производительности, а в удобстве обслуживания и надежности.
Позвольте мне привести реальный пример, с которым я столкнулся совсем недавно. Программист создал функцию, которая приняла параметр String, идентифицирующий тип транзакции. Затем в программе он сравнивал строки с этим типом. Как:
if (type.equals("stock"))
{ ... do whatever ... }
Затем он вызвал эту функцию, передав ей значение «Stock».
Вы заметили разницу в капитализации? Ни один не сделал оригинальный программист. Это оказалось довольно тонкой ошибкой, чтобы понять, потому что, даже глядя на оба списка, разница в капитализации меня не поразила.
Если вместо этого он объявил окончательную статичность, скажем
final static String stock="stock";
Тогда в первый раз, когда он попытался передать «Stock» вместо «stock», он получил бы ошибку времени компиляции.
Еще лучше в этом примере было бы сделать перечисление, но давайте предположим, что он действительно должен был записать строку в выходной файл или что-то в этом роде, так что это должна быть строка.
Использование окончательной статики дает как минимум x преимуществ:
(1) Если вы ошибетесь, вы получите ошибку во время компиляции, а не едва заметную ошибку во время выполнения.
(2) Статика может присваивать значимому имени значение. Что более понятно:
if (employeeType.equals("R")) ...
или
if (employeeType.equals(EmployeeType.RETIRED)) ...
(3) Когда есть несколько связанных значений, вы можете поместить группу окончательных статик вместе в верхней части программы, таким образом информируя будущих читателей, каковы все возможные значения. У меня было много раз, когда я видел функцию, сравнивающую значение с двумя или тремя литералами. И это заставляет меня задуматься: есть ли другие возможные ценности, или это так? (Еще лучше часто иметь перечисление, но это другая история.)