Private final – избыточен. Жирная точка в вопросе.

Home » JavaCore » Private final – избыточен. Жирная точка в вопросе.
JavaCore Комментариев нет

Как писать? private final или просто private?

Многие среды разработки называют private final – избыточной конструкцией, но код при этом остается компилируемым. Почему?

Что вводит в заблуждение?

Что же вводит в заблуждение тех, кто применяет конструкцию private final?

  1. Во первых – отсутствие синтаксической ошибки! Компилятор понимает эту конструкцию.
  2. Во-вторых знание – того, что final сокращает время компиляции кода во время выполнения кода(The Java HotSpot Compilers, Method Inlining).
  3. В третьих – то, что значение final для поля и значение final для метода, – вещи принципиально разные(“финальное поле” может быть лишь единожды проинициализировано, “финальный метод” не может быть переопределен в субклассе).
  4. В четвертых – желание “максимально защитить и оптимизировать свой код”.

Так нужна ли эта конструкция вообще? Ответ:

  1. 4 пункт нерационален
  2. 3 пункт – путаница в понимании final изза коренного различия применений слова преодолевается пониманием. Нужно, просто привыкнуть, понять и простить. Понять синтаксис и простить разработчиков языка за двусмысленность одного служебного слова
  3. 2 пункт – компилятору JIT(компилятору времени выполнения) абсолютно все равно private final или private, – если что то недоступно подклассу он “заинлайнит” в любом случае. Поэтому этот пункт снимается в пользу private.(однако следует помнить, что модификатор final, там где не нужен private поможет “заинлайнить” код во время выполнения, поэтому такая оптимизация, где это возможно – лишней не будет)
  4. 1 пункт – вот тут вопрос… Не пора бы прекратить компилировать эту конструкцию, а не просто выводить уведомления об избыточности?

1:0 побеждает private!

Что нужно знать?

Объявляя поле или метод как private мы ПОЛНОСТЬЮ инкапсулируем, “прячем” этот элемент в классе, – и для потомков он теряется из видимости и для других классов.

Объявляя элемент как final мы лишь запрещаем переопределение этого элемента, но из видимости для потомка и для других классов элемент не выпадает.

Таким образом, в плане инкапсуляции, private намного мощнее final и представляет собой, столп на котором держится вся инкапсуляция. В то время как final лишь вводит “точечный” запрет на наследование для методов, инкапсуляции полей он вообще не касается(просто превращает переменные в константы, не касаясь вопроса их доступа). Private таким образом, намного мощнее в плане инкапсуляции, чем final. И использование final вслед за private – является ИЗБЫТОЧНЫМ.

Документация по inlining
На код-ранче, придерживаются мнения, что private final – конструкция избыточная, и что нужно использовать просто private.
Интересно о модификаторах и экзаменационных вопросах по ним
Обсуждение этого вопроса

LEAVE A COMMENT