Ответ
Композиция — это отношение «часть-целое» с сильной связью, где жизненный цикл объекта-части полностью зависит от жизненного цикла объекта-целого. Если объект-целое уничтожается, уничтожаются и все его части. Это ключевой принцип для построения сложных объектов из более простых.
Пример: Компьютер и его компоненты
// Классы-части
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(...). Эти штуки рождаются прямо тут, внутри. Они — его сокровенные внутренние органы, блядь. И нету никаких сеттеров — значит, после сборки тебе никто не даст засунуть туда левый процессор с барахолки. Всё, пипец, система закрытая.
А теперь главное — отличие от этой вашей агрегации, про которую все так любят трещать. При агрегации тебе бы этот процессор и память принесли с улицы, сунули в руки и сказали: «Держи, собери комп». И если комп сломается — детальки можно выковырять и продать на запчасти, они же независимые были! А в композиции — нихуя. Всё в одном флаконе. Уничтожил целое — похоронил и все части. Жестко, зато честно.
Вот так и живём: создаём монолитные сущности, где всё зависит друг от друга, как в хорошей, блядь, драме. Одна смерть — и общий конец. Красиво, чо.