Последнее время у меня появились сильные загоны на перфекционизм. Глядя на продакшен код проектов понимаешь, что он говно, и хочется хотя-бы в своей уютной репе всё делать по канонам. Большинство вопросов у меня возникло по final в разных контекстах его применения, которые хотелось бы тут обсудить (без срача, пожалуйста, только аргументы и факты).
Первое - классы. Если опираться на трактовку Open Closed принципа, то мы должны иметь возможность отнаследоваться от класса, чтобы расширить его функциональность, потому final классами должны быть как правило только утилитные классы, либо то, что логически по тем или иным причинам не должно использоваться как родитель чего-либо.
Методы - а вот тут уже интереснее, опять же возвращаемся к трактовке Open Closed, правильно ли я понимаю, что все методы класса должны быть помечены как final? Т.е. даже если кто-то отнаследуется от класса, он сможет только докинуть своих методов, но не сможет переопределить то, что уже имеется. Такой же вопрос к методам-реализациям. Если класс, допустим, является реализацией какого-либо интерфейса, должны ли Override методы из этого интерфейса быть final?
Переменные: Локальные - да, если не меняются на протяжении области видимости, в сигнатуре функции судя по всему тоже да, чтобы не было возможности сделать вот так
public void foo(String s) {
s = "New String";
}
Соб-но, дискасс, а где и как ты, ЛОРовец, используешь final и как видишь данную ситуацию?