Рубрики
Без рубрики

Эффективная Java! Отдавайте предпочтение статическим классам членов перед Нестатическими

Погружение в главу 24 “Эффективная Java”. Помеченный как java, эффективный, интерфейсы, архитектура.

Эффективный обзор Java (Серия из 79 частей)

Java предоставляет четыре способа объявления класса внутри другого класса: статический класс-член , нестатические классы-члены , анонимные классы и локальные классы . У каждого типа есть свои преимущества и у этого есть недостатки, поэтому понимание правильных вариантов использования для каждого типа поможет нам использовать правильный в нашем коде. Давайте рассмотрим каждый тип.

Статический класс-член : Это самый простой из вариантов вложенного класса. В конечном итоге это в основном обычный класс, который находится внутри другого класса. Его можно извлечь, не имея ссылки на заключающий класс. Эти классы являются статическими членами заключающего класса и подчиняются тем же правилам видимости, что и другие члены класса. Обычно класс этого типа используется в качестве помощника для заключающего класса. Например, давайте рассмотрим класс Калькулятор . Возможно, это будет иметь Операция вложенный класс, который включает в себя ряд констант, определяющих различные операции, которые могут быть выполнены в калькуляторе. Доступ к ним можно получить следующим образом Калькулятор. Операция. плюс или Калькулятор. Операция. минус . Это создает хорошую организацию для доступа к этим вспомогательным классам. Еще одно место, где вы увидите использование этих статических вложенных классов, – это шаблон Builder, где объект builder является вложенным классом внутри создаваемого класса.

Класс нестатических членов : Единственное различие между объявлением статического вложенного класса и нестатического вложенного класса – это слово статический но эта разница в одном слове имеет большое различие между этими двумя типами. В этом случае каждый экземпляр заключающего класса имеет неявное соединение с заключающим классом и имеет доступ к членам заключающего класса. Этот метод нельзя использовать, если вложенный класс должен иметь возможность существовать вне контекста включающего класса, поскольку это невозможно в нестатическом вложенном классе. Соединение между заключающим классом и вложенным классом создается при создании заключающего класса. Создание этого соединения требует времени, а также занимает много места. Примером использования этого типа вложенного класса является использование шаблона Адаптер , где он позволяет рассматривать состояние класса как несвязанный тип. Это отличный вариант использования, так как этот метод позволяет получить доступ к этому внутреннему состоянию, в то же время позволяя создавать новый класс. Мы можем видеть эти виды использования в дикой природе с помощью карты набора ключей , набора записей и значений , а также Набора и Список итератор . Итак, нестатические вложенные классы-члены, похоже, обладают большой мощью, каковы их недостатки? Как упоминалось выше, для создания соединения вложенного и вложенного классов требуется время, а также память в куче. Если вам не нужны преимущества нестатического типа, то нет необходимости платить эту цену. Это еще хуже в том смысле, что становится намного проще создавать утечки памяти с помощью нестатического вложенного класса, поскольку вложенный класс может содержать ссылку на охватывающий класс, что может привести к классу, который должен иметь право на сборку мусора из собранного.

Анонимный класс : Анонимные классы имеют ряд ограничений. Вы не можете создавать их экземпляры, кроме как в момент объявления, вы не можете выполнять запросы instanceof класса или делать что-либо еще, для чего требуется имя класса. Анонимные классы также не могут реализовывать несколько интерфейсов или расширять класс и реализовывать интерфейс одновременно. До появления лямбды в Java 8 анонимные классы были предпочтительным способом создания небольших объектов на лету, теперь лямбда -предпочтительный метод.

Локальный класс : Это наименее используемый метод, который я лично никогда не использовал. Они могут быть объявлены практически в любом месте, где может быть объявлена локальная переменная. Локальные классы могут иметь имена, могут использоваться повторно и могут ссылаться на членов заключающего класса. Они должны быть короткими, чтобы не ухудшать читабельность.

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

Эффективный обзор Java (Серия из 79 частей)

Оригинал: “https://dev.to/kylec32/effective-java-favor-static-members-classes-over-non-static-odj”