К какому паттерну проектирования ближе всего Generics (обобщения) в Java?

«К какому паттерну проектирования ближе всего Generics (обобщения) в Java?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Generics (обобщённое программирование) — это языковая конструкция для обеспечения параметрического полиморфизма. Прямого аналога среди классических GoF-паттернов нет, но концептуально Generics чаще всего устраняют необходимость в паттерне Type-Safe Heterogeneous Container и способствуют реализации Strategy и Template Method.

1. Замена Type-Safe Heterogeneous Container: Без Generics для хранения объектов разных типов в type-safe манере требовался сложный паттерн. Generics решают это элегантно:

// Без Generics: Небезопасно, требует приведения типов.
// С Generics:
public class Box<T> {
    private T content;
    public void set(T content) { this.content = content; }
    public T get() { return content; } // Безопасное приведение
}
Box<String> stringBox = new Box<>();
String value = stringBox.get(); // Тип гарантирован компилятором.

2. Поддержка паттернов:

  • Strategy: Generics позволяют параметризовать стратегию типом данных.
    interface SortingStrategy<T> {
        void sort(List<T> items);
    }
  • Template Method: Базовый класс может использовать generic-типы для абстрактных операций.
    abstract class Processor<T, R> {
        public final R process(T input) {
            validate(input);
            return doProcess(input); // Абстрактный шаг
        }
        protected abstract R doProcess(T input);
    }

Главная цель Generics — обеспечение безопасности типов на этапе компиляции и устранение ручных приведений (casts), что делает код чище и надёжнее.