Шаблон в языке java

Шаблоны в Java (Обобщенные типы. Generics)

Обобщения позволяют создавать структуры данных и алгоритмы, которые можно было бы использовать с различными типами, не создавая каждый раз специфичные версии тех же структур для каждого из типов в отдельности. Особенно важно это для абстрактных типов данных вроде стеков и очередей. Конечно, можно создать десяток версий стека для работы с целыми числами (IntStack), символами (CharStack) или числами с плавающей точкой (FloatStack). Но гораздо удобнее было бы реализовать некий общий интерфейс и пользоваться им, не завися от типа данных, с которым мы работаем. Теоретически мы могли бы создать одну структуру данных, хранящую объекты, приведенные к типу Object, но в этом случае никто не может гарантировать что в этой структуре данных действительно будут храниться данные только нужно нам типа.

Шаблон класса

Параметры шаблона класса указываются в угловых скобках. Класс не может быть потомком класса Throwable. Если в С++ по шаблону класса создается именно новый класс, то в Java типы, созданные по одному шаблону, являются классом этого шаблона. Поэтому тип параметра нельзя использовать для определения статических членов или использовать в статических методах.

public class TstTpl  < private T t; public TstTpl(T tt) < t = tt; >public void out() < System.out.println("tplclass="+getClass()+ ", param + t.getClass() + ", val=" + t.toString()); >public static void main(String[] args) < new TstTpl(true).out(); // сгенерированные типы принадлежат одному классу TstTpl a = new TstTpl(1); TstTpl b = new TstTpl(3.14); System.out.println(a.getClass() == b.getClass()); > >

В угловых скобках указывается имя параметра типа. Затем вместо него будет подставлено имя реального типа. То есть повсюду параметр T будет заменен на тип, указанный в угловых скобках. Метод out() вспомогательный и в нем мы выводим на экран реальный тип хранимого объекта, используя такое свойство, как рефлексия. Рефлексия не является темой данной статьи, но если вкратце, то она позволяет во время выполнения программы получать сведения о классе. В данном случае это имя класса. Классы, необходимые для использования рефлексии, хранятся в пакете java.lang.reflect .

Читайте также:  Php json to yaml

Шаблон метода

public class TstTplm < static void outmerge(T1 t1, T2 t2) < System.out.println(t1.toString() + t2); >public static void main(String[] args) < outmerge(new Double(3.14),new Boolean(true)); >>

Стирание типов (type erasure) и ограничения

В Java для реализации параметризированных классов с целью обеспечения совместимости со старыми версиями языка используется механизм стирания типов во время компиляции. То есть во время выполнения программы фактический тип неизвестен. Стирание выполняется до типа Object либо до типа, указанного при помощи указания ограничения. Следующие два примера демонстрируют поведение кода с ограничениями и без них:

В закомментированной строке производится вызов некоторого метода объекта типа T, но в этом случае компилятор выведет сообщение об ошибке. Это произойдет из-за принципа работы механизма стирания. Во время выполнения программа ничего не знает о том, какой конкретный тип имеет переменная t и, соответственно, ничего не знает о его методах. Все, что мы можем — это вызывать методы, определенные в классе Object , так как стирание произойдет до типа Object . А что если мы знаем о том, какие типы будет принимать данный класс и хотим вызывать их методы? Для этого существуют ограничения. Пример с использованием синтаксиса ограничений приведен ниже.

class MyClass < public void doSomething()<>> //используем ограничения class Generic < private T obj; public void method() < //Компилятор не выдает никаких сообщений об ошибке! obj.doSomething(); >>
  • ? — указывает на любой класс. классы, но сама специфика класса для них не важна;
  • ? extends T — определяет множество классов потомков от T;
  • ? super T — определяет множество родительских классов класса T.

Например, если нам нужен метод вывода списка фигур, потомков абстрактного класса Shape, то определение метода будет выглядеть следующим образом.

public void draw(List shape) < //. >

Источник

Читайте также:  Jquery animate scrolltop body html

Паттерны проектирования в Java [Часть 1]

Java-университет

Паттерны проектирования в Java [Часть 1] - 1

Это краткая статья по паттернам проектирования в Java. Реализации паттернов не будет, тут только список паттернов которые есть в java и их краткое содержание. Она будет полезна тем, кто уже в теме, для повторения и обобщения. Или напротив, для тех, кто первый раз подошёл к паттернам — для самого первого обзора темы, прежде, чем копнуть глубже. Паттерны проектирования (шаблоны проектирования) — это готовые к использованию решения часто возникающих в программировании задач. Это не класс и не библиотека, которую можно подключить к проекту, это нечто большее. Паттерны проектирования, подходящий под задачу, реализуется в каждом конкретном случае. Следует, помнить, что такой паттерн, будучи примененным неправильно или к неподходящей задаче, может принести немало проблем. Тем не менее, правильно примененный паттерн поможет решить задачу легко и просто. Типы паттернов:

  • порождающие
  • структурные
  • поведенческие

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

  • Singleton (Одиночка) — ограничивает создание одного экземпляра класса, обеспечивает доступ к его единственному объекту.
  • Factory (Фабрика) — используется, когда у нас есть суперкласс с несколькими подклассами и на основе ввода, нам нужно вернуть один из подкласса.
  • Abstract Factory (Абстрактная фабрика) — используем супер фабрику для создания фабрики, затем используем созданную фабрику для создания объектов.
  • Builder (Строитель) — используется для создания сложного объекта с использованием простых объектов. Постепенно он создает больший объект от малого и простого объекта.
  • Prototype (Прототип) — помогает создать дублированный объект с лучшей производительностью, вместо нового создается возвращаемый клон существующего объекта.

Структурные:

  • Adapter (Адаптер) — это конвертер между двумя несовместимыми объектами. Используя паттерн адаптера, мы можем объединить два несовместимых интерфейса.
  • Composite (Компоновщик) — использует один класс для представления древовидной структуры.
  • Proxy (Заместитель) — представляет функциональность другого класса.
  • Flyweight (Легковес) — вместо создания большого количества похожих объектов, объекты используются повторно.
  • Facade (Фасад) — беспечивает простой интерфейс для клиента, и клиент использует интерфейс для взаимодействия с системой.
  • Bridge (Мост) — делает конкретные классы независимыми от классов реализации интерфейса.
  • Decorator (Декоратор) — добавляет новые функциональные возможности существующего объекта без привязки его структуры.

Поведенческие:

  • Template Method (Шаблонный метод) — определяющий основу алгоритма и позволяющий наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.
  • Mediator (Посредник) — предоставляет класс посредника, который обрабатывает все коммуникации между различными классами.
  • Chain of Responsibility (Цепочка обязанностей) — позволяет избежать жесткой зависимости отправителя запроса от его получателя, при этом запрос может быть обработан несколькими объектами.
  • Observer (Наблюдатель) — позволяет одним обьектам следить и реагировать на события, происходящие в других объектах.
  • Strategy (Стратегия) — алгоритм стратегии может быть изменен во время выполнения программы.
  • Command (Команда) — интерфейс команды объявляет метод для выполнения определенного действия.
  • State (Состояние) — объект может изменять свое поведение в зависимости от его состояния.
  • Visitor (Посетитель) — используется для упрощения операций над группировками связанных объектов.
  • Interpreter (Интерпретатор) — определяет грамматику простого языка для проблемной области.
  • Iterator (Итератор) — последовательно осуществляет доступ к элементам объекта коллекции, не зная его основного представления.
  • Memento (Хранитель) — используется для хранения состояния объекта, позже это состояние можно восстановить.

Проходя курс JavaRush вы встретите пару паттернов из этого списка. Рекомендую задачи по паттернам: 1522, 1530, 1631, big01, 2912, 3107. Разумное использование паттернов проектирования приводит к повышению надежности обслуживания кода, поскольку в дополнение к тому, чтобы быть хорошим решением общей проблемы, паттерны проектирования могут быть распознаны другими разработчиками, что уменьшает время при работе с определенным кодом. Паттерны проектирования в Java [Часть 2]

Источник

Оцените статью