В исходниках LibGDX, в классе Vector2 есть метод dst, который определяет расстояние между векторами. Vector2.java Вот он: public float dst (float x, float y) { final float x_d = x - this.x; final float y_d = y - this.y; return (float)Math.sqrt(x_d * x_d + y_d * y_d); } В нем промежуточные переменные x_d, y_d объявлены как final. Зачем? Чем бы это отличалось от этого: public float dst (float x, float y) { float x_d = x - this.x; float y_d = y - this.y; return (float)Math.sqrt(x_d * x_d + y_d * y_d); } В этом есть какая то особая магия?
Ответ
final — прежде всего защита от самого себя Дело в том, что хорошие компиляторы «умнее» людей. Компилятор может легко пробежаться по коду и выяснить, изменяется ли переменная в методе, и сам применить нужные оптимизации, если считает нужным. Время «подсказок компилятору» на нормальных платформах прошло. А вот защититься от собственных глупых ошибок — например, чтобы случайно не изменить переменную, которую вовсе не нужно менять — хорошая идея. Если вы случайно измените final-переменную, компилятор немедленно подскажет вам об этом. Вы можете смотреть на final как на часть декларации типа. Можно было бы в принципе отказаться от type safety и использовать только тип Object в программе. Когда вы говорите, что переменная имеет тип String, вы намеренно ограничиваете себя: теперь вы можете присваивать объекту только String-значения, при попытке присвоить int компилятор укажет вам на ваш просчёт. Точно так же декларация final позволяет вам ограничить себя, запретить самому себе менять значение, чтобы защититься от ошибок. Мне кажется, указывать наиболее сильное ограничение переменной по типу — хорошая привычка. Действительно, в данном конкретном коде константность переменной очевидна и без final и не приносит дополнительных дивидендов. Тем не менее, имеет смысл не задумываясь ставить final везде, где переменная не должна меняться, не отвлекаясь на то, как в данный момент реализован метод.
Комментариев нет:
Отправить комментарий