Что такое композиция в ООП? Приведите пример на 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.
    }
}

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

Ответ 18+ 🔞

А, ну вот, композиция, говоришь? Это ж когда одно к другому припаяно намертво, как рука к телу, блядь. Если тело — в могилу, то и рука туда же, в рот меня чих-пых! Никакой самостоятельной жизни. Полный пиздец для части, если целое решило накрыться медным тазом.

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

Есть у него мозги — процессор. Есть память — оперативка. Так вот, в нормальной композиции этот ящик их рождает сам, внутри себя, как мамаша детей. И если ящик сдохнет — ну, скажем, ты его об стенку ебнешь в припадке гнева — то и мозги, и память летят в утиль вместе с ним. Они не сбегут жить в другой системник, пидарасы шерстяные. Их жизненный цикл — один на всех, как в плохом анекдоте.

Вот, глянь на код, тут всё честно:

// Классы-части
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.
    }
}

Видишь, в чём фишка-то, ёпта? В конструкторе Computer происходит магия: new CPU(...) и new RAM(...). Эти штуки рождаются прямо тут, внутри. Они — его сокровенные внутренние органы, блядь. И нету никаких сеттеров — значит, после сборки тебе никто не даст засунуть туда левый процессор с барахолки. Всё, пипец, система закрытая.

А теперь главное — отличие от этой вашей агрегации, про которую все так любят трещать. При агрегации тебе бы этот процессор и память принесли с улицы, сунули в руки и сказали: «Держи, собери комп». И если комп сломается — детальки можно выковырять и продать на запчасти, они же независимые были! А в композиции — нихуя. Всё в одном флаконе. Уничтожил целое — похоронил и все части. Жестко, зато честно.

Вот так и живём: создаём монолитные сущности, где всё зависит друг от друга, как в хорошей, блядь, драме. Одна смерть — и общий конец. Красиво, чо.