Что такое композиция в ООП? Приведите пример на Java.

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

Ответ

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

Пример: Компьютер и его компоненты

// Классы-части
class CPU {
    private String model;
    public CPU(String model) { this.model = model; }
    public void execute() { System.out.println("CPU " + model + " is executing instructions"); }
}

class RAM {
    private int sizeGb;
    public RAM(int sizeGb) { this.sizeGb = sizeGb; }
    public void load() { System.out.println("Loading data into " + sizeGb + "GB RAM"); }
}

// Класс-целое, использующий композицию
class Computer {
    // Части создаются внутри конструктора целого и не существуют отдельно.
    private final CPU cpu;
    private final RAM ram;

    public Computer(String cpuModel, int ramSize) {
        this.cpu = new CPU(cpuModel); // Композиция: создание части
        this.ram = new RAM(ramSize);   // Композиция: создание части
    }

    public void start() {
        ram.load();
        cpu.execute();
        System.out.println("Computer started.");
    }

    // Нет сеттеров для cpu и ram. Их нельзя заменить извне после создания.
}

// Использование
public class Main {
    public static void main(String[] args) {
        Computer myPC = new Computer("Intel i7", 16);
        myPC.start();
        // При удалении myPC сборщик мусора удалит и его cpu, и ram.
    }
}

Отличие от агрегации: При агрегации части передаются в объект-целое извне (через конструктор/сеттер) и могут существовать независимо. В композиции целое владеет частями и создаёт их само.