Помечая все поля класса final
, вы даете понять, что хотите, чтобы ваш класс был неизменным.
Предположим, у вас есть следующий класс:
public class Immutable {
private int value;
public Immutable (int value) {
this.value = value;
}
public int getValue () {
return value;
}
}
Метод установки отсутствует, поэтому можно легко предположить, что этот класс неизменяем. Так оно и есть на данный момент. Но со временем ваш класс будет изменен другим программистом, и этот программист может добавить в ваш класс несколько методов:
public class Immutable {
private int value;
public Immutable (int value) {
this.value = value;
}
public int getValue () {
return value;
}
public void doSomething () {
value++;
}
}
Довольно легко случайно добавить метод, который изменяет состояние вашего объекта, если поля не final
. Отметив их final
, этот другой программист получит ошибку компиляции, когда он попытается изменить поле, и ему придется спросить себя, почему это поле final
, и нарушает ли его модификация контракт этого класса.
Можно было бы возразить, что Javadoc следует использовать для документирования того, что указанный класс неизменен, но, откровенно говоря, не все читают Javadoc. На мой взгляд, лучше заставить код говорить сам за себя.
person
Laf
schedule
23.03.2015