Я не могу понять, где ключевое слово final
действительно удобно, когда оно используется в параметрах метода.
Если мы исключаем использование анонимных классов, читаемости и декларации намерений, то это кажется мне почти бесполезным.
Принуждение к тому, что некоторые данные остаются постоянными, не так сильно, как кажется.
-
Если параметр является примитивным, он не будет иметь никакого эффекта, поскольку параметр передается методу в качестве значения, а его изменение не будет иметь эффекта вне области видимости.
-
Если мы передаем параметр по ссылке, то сама ссылка является локальной переменной и если ссылка изменена внутри метода, это не будет иметь никакого эффекта из-за пределов области метода.
Рассмотрим простой пример теста ниже. Этот тест проходит, хотя метод изменил значение заданной ему ссылки, он не имеет эффекта.
public void testNullify() {
Collection<Integer> c = new ArrayList<Integer>();
nullify(c);
assertNotNull(c);
final Collection<Integer> c1 = c;
assertTrue(c1.equals(c));
change(c);
assertTrue(c1.equals(c));
}
private void change(Collection<Integer> c) {
c = new ArrayList<Integer>();
}
public void nullify(Collection<?> t) {
t = null;
}