+38 (097) 099-97-97 JAVA ТРЕНИНГИ
JAVA ТРЕНИНГИ

Создание объектов в Java. Статический фабричный метод и конструкторы

Рассматриваемые темы:

 

  • Обзор способов создания объектов в Java
  • Порождающие статические методы
  • Приемущества и недостатки статических методов
  • Примеры использования в стандартной библиотеке

 

Способы создания объектов в Java

 

Конечно же самым стандартным и очевидным методом создания объектов является использование конструктора

В этом примере я использовал локальный класс, объект которого мы создаём, но конечно же вам никто не мешает объявить его как внешний.

Но кроме данного метода, так же есть более усовершенствованные подходы:

  1. Фабричный метод.
  2. Статический метод генерации.

Использование фабричного метода — это подход хорошо описанный в книге банды четырёх Приёмы объектно-ориентированного проектирования. Паттерны проектирования

А статические методы генерации мы сейчас рассмотрим более подробно.

Порождающие статические методы

Здесь же мы рассмотрим подход по английски звучащий как static factory method, который на русский язык можно перевести как «Порождающий статический метод» или «Статический метод генерации».

Чтобы хорошо разобраться в этом подходе, нужно примерное понимание о static методах

О статических методах можно почитать в книге Java. Библиотека профессионала

Порождающий статический метод представляет собой обычный статический метод, который создаёт и возвращает объект (экземпляр) нужного нам класса.

В отличии от «Фабричного метода», как можно увидеть в примере, порождающие статические методы могут использоваться совместно с конструктором, а не вместо него.

Приемущества статических методов

 

  1. Можно задать имя
  2. Не обязаны порождать новые экземпляры
  3. Может возвращать объекты разных типов
  4. Автоматический даймонд оператор

 

Можно задавать имя

Возможность задавать имя статическому методу может сделать, в целом, код приложения более читаемым.

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

Допустим если нам необходимо сделать два конструктора, работа которых отличается, но количество параметров в которых одинаково. Такая ситуация возможна например если нам нужно написать конструктор порождающий экземпляр и конструктор порождающий экземпляр и сохраняющий передаваемые значения как значения по умолчанию для возможного последующего вызова конструктора без параметров.

В этом случае перегрузка конструкторов непоможет, т.к. в классе не может быть несолько методов с одинаковой сигнатурой, поэтому придётся менять порядок следования параметров в этих конструкторах, что бы сработала перегрузка (что некрасиво и неочевидно для пользователя класса). Но если список параметров поменять не удаётся, то мы можем прийти к вот такой вот ситуации.

Такой код не скомпилируется. Обратите внимание на попытку создать конструкторы с параметром name. В данном случае придётся добавлять ещё один параметр и добавлять логику в конструктор, что мерзковато.

Гораздо более изящное решение можно реализовать с помощью статических методов.

В этом примере мы создаём два статических порождающих метода с разными именами, каждый делает то что должен и по названию можем понять что же они делают.

Не обязаны порождать новые экземпляры

 

Если вы вызываете конструктор, до он обязательно создаст вам новый объект. А что если вы хотите вернуть уже существующий? Такая необходимость может возникать при реализации шаблонов проектирования. Статический метод генерации имеет возможность выбора между созданием нового и использованием уже существующего обхектов.

Может возвращать объект любого типа

 

Следующее существенное ограничения конструктора — это то что конструктор всегда возвращает объект того класса, у которого он вызывается. Статический метод может возвращать объекты разных типов. Единственное ограничение, которое есть у статического метода генерации — это ковариантный возврат, можно возвращать только совместимый тип с типом, объявленным как возвращаемый.

Из недостатков стоит отметить то, что статический метод генерации трудно отличим от других статических методов, сложно сразу понять его отличительные черты по имени.

Примеры использования в стандартной библиотеке

 

Наиболее эффективным способом преобразования примитивных в строки является использование метода
String.valueOf()
Он преобразует числа, объекты, символы, массивы символов в строки и работает в отличии от конструктора быстрее.
Это касается использование метода valueOf у всех классов врапевров от Byte до Long.

Значения в определённом диапазоне кэшиируются кэшируются и использование этого метода более эффективно нежели конструктор

Другой пример — это создание объектов даты и времени в Java 8. Создание всех объектов библиотеки java.time выполняется с помощью статических методов генирации

Так же в Java 8 создаются потоки данных с помощью пораждающего статического метода
Не смотря на то, что способов создания потоков несколько, все способы схожи — используются генерирующие методы

Здесь поток создаётся на основании передаваемых в метод значений

Здесь поток создаётся на основании передаваемого метода генерации в виде лямбды

Здесь создание потока выполняется на основании массива, не совсем классически, но тем не менее.

Рад ответить на ваши вопросы, пожалуйста задавайте их в комментариях в статье.

Прокомментировать

× Ваш комментарий будет опубликован после модерации Спасибо!
× Слишком много комментариев за короткий период времени Пожалуйста, попробуйте позже
контакты

Записаться на ближайший тренинг можно с помощью формы.

отправить
Курсы java Киев, Курсы по программированию на Java Киеве
Показать сообщение про успешную отправку
Спасибо за заявку!
Заполните форму и мы вам перезвоним
отправить
Заполните форму и начните учить Java правильно
Выберите курс
записаться
jon.com.ua