Різниця в реалізації між агрегацією та складом на Java


102

Мені відомі концептуальні відмінності між агрегацією та складом. Чи може хтось сказати мені різницю реалізації в Java між ними з прикладами?


3
Перейшовши за цим посиланням, ви зможете отримати відповідь на свої повідомлення [Відмінність між агрегацією та складом] [1] [1]: stackoverflow.com/a/1468285/1353243
gks

можливий дублікат Агрегації проти складу
Алекс К

Також дивіться c-
shar

Коли ми маємо будь-яке відношення між об'єктами, це називається асоціацією. І агрегація, і склад є спеціалізованою формою асоціації. Склад знову спеціалізована форма Агрегації. javabench.in/2011/08/difference-between-association.html
Raúl

ви можете знайти більше відповідей тут
hamed moosaei

Відповіді:


222

Склад

final class Car {

  private final Engine engine;

  Car(EngineSpecs specs) {
    engine = new Engine(specs);
  }

  void move() {
    engine.work();
  }
}

Агрегація

final class Car {

  private Engine engine;

  void setEngine(Engine engine) {
    this.engine = engine;
  }

  void move() {
    if (engine != null)
      engine.work();
  }
}

Що стосується складу, Двигун повністю інкапсульований Автомобілем. У зовнішньому світі немає можливості отримати посилання на Двигун. Двигун живе і гине з машиною. При агрегації Автомобіль також виконує свої функції через Двигун, але Двигун не завжди є внутрішньою частиною Автомобіля. Двигуни можуть бути замінені або навіть повністю зняті. Мало того, але зовнішній світ все ще може мати посилання на Двигун, і повозитися з ним незалежно від того, чи є він у Автомобілі.


7
Чудовий приклад! Він також показує склад як сильну асоціацію (Автомобіль не має сенсу без Двигуна) та агрегацію як слабку асоціацію (Автомобіль без Двигуна має цілком сенс, він навіть не потребує його у своєму конструкторі). Який використовувати? Залежить від контексту.
Федеріко Пуньялі

@А приклад, який ви даєте в Агрегації, це не приклад залежності? Залежність є більш слабкою формою взаємозв'язку і в кодовому виразі вказує на те, що клас використовує інший за параметром або типом повернення.
Охань

@Anand: чи можете ви пояснити більше, чому ви сказали: у випадку складу немає можливості зовнішньому світу отримати посилання на Двигун, при агрегації зовнішній світ може мати посилання на Двигун? Чи можете ви показати у зразку коду, як зовнішній світ може чи не може мати посилання на двигун? дякую
О Коннор

9
Це не правильний приклад. Зовнішній світ може мати доступ до внутрішнього об'єкта, але його ідентичність завжди пов'язана із зовнішнім об'єктом, тоді як у сукупності внутрішній об’єкт може існувати незалежно, навіть якщо не було машини. У цьому випадку двигун все ще може бути створений за допомогою new Engine(EngineSpecs)виклику, навіть якщо не було машини. Спосіб досягнення композиції полягає у створенні двигуна як внутрішнього класу, щоб об'єкт двигуна завжди створювався з посиланням на автомобільний об’єкт
mickeymoon

@mickeymoon чудовий улов. чи можете ви вказати на кращий приклад?
Gayan Weerakutti

19

Я б використав приємний приклад UML.

Візьміть університет, який має від 1 до 20 різних кафедр, і кожен відділ має від 1 до 5 професорів. Між університетом та його кафедрами існує зв'язок композиції. Існує зв'язок між кафедрою та її професорами.

Склад - це просто СТРУЧНА агрегація, якщо університет буде знищений, то кафедри також повинні бути знищені. Але ми не повинні вбивати професорів, навіть якщо їхні кафедри зникнуть.

У java:

public class University {

     private List<Department> departments;

     public void destroy(){
         //it's composition, when I destroy a university I also destroy the departments. they cant live outside my university instance
         if(departments!=null)
             for(Department d : departments) d.destroy();
         departments.clean();
         departments = null;
     }
}

public class Department {

     private List<Professor> professors;
     private University university;

     Department(University univ){
         this.university = univ;
         //check here univ not null throw whatever depending on your needs
     }

     public void destroy(){
         //It's aggregation here, we just tell the professor they are fired but they can still keep living
         for(Professor p:professors)
             p.fire(this);
         professors.clean();
         professors = null;
     }
}

public class Professor {

     private String name;
     private List<Department> attachedDepartments;

     public void destroy(){

     }

     public void fire(Department d){
         attachedDepartments.remove(d);
     }
}

Щось навколо цього.


Я сподіваюся, що я не отримаю коментарів щодо неініціалізованих списків і жодних конструкторів. Я написав це швидко, відсутні частини є здоровим глуздом, але якщо мене запитають, я
дороблю

Дякую! Ваш приклад ідеально зрозумілий. Але я не міг зрозуміти вашу ілюстрацію коду. Чи можете ви сказати мені про основну різницю впровадження між ними? Якщо мені доведеться реалізувати Агрегацію чи склад, які поняття в Java я повинен використовувати?
Раджат

це точно така ж реалізація, якщо ви говорите про склад класу, але композиція повинна відображатись тим, як ви керуєте екземплярами, як у моїй
редакції

4

Нижче наведено чудове пояснення у вказаній URL-адресі.

введіть тут опис зображення

http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit

Будь ласка, перевірте!!!


Привіт Рахуле, хоча це посилання може відповісти на питання, краще включити сюди основні частини відповіді та надати посилання для довідок. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться. Будь ласка, подивіться тут: Чому і як видаляються відповіді?
буммі

3

Різниця полягає в тому, що будь-який склад - це агрегація, а не навпаки.

Давайте встановимо умови. Агрегація є метатермою у стандарті UML і означає BOTH композицію та спільну агрегацію, яку просто називають спільною . Занадто часто його неправильно називають "агрегацією". Це БАД, для композиції теж є агрегація. Як я розумію, ви маєте на увазі "поділився".

Далі від стандарту UML:

композитний - вказує на те, що властивість об'єднана складно, тобто складений об'єкт несе відповідальність за існування та зберігання складених об'єктів (частин).

Отже, асоціація "Університет з Кафедрами" - це склад, оскільки кафедра не існує поза університетом (ІМХО)

Точна семантика спільної агрегації змінюється залежно від області застосування та моделера.

Тобто всі інші асоціації можна скласти як спільні агрегації, якщо ви дотримуєтесь лише певних ваших принципів чи когось іншого. Також дивіться тут .


3

Простими словами:

І Склад, і Агрегація є асоціаціями. Склад -> Сильні стосунки Агрегація -> Слабкі стосунки.


2

Проста композиційна програма

public class Person {
    private double salary;
    private String name;
    private Birthday bday;

    public Person(int y,int m,int d,String name){
        bday=new Birthday(y, m, d);
        this.name=name;
    }


    public double getSalary() {
        return salary;
    }

    public String getName() {
        return name;
    }

    public Birthday getBday() {
        return bday;
    }

    ///////////////////////////////inner class///////////////////////
    private class Birthday{
        int year,month,day;

        public Birthday(int y,int m,int d){
            year=y;
            month=m;
            day=d;
        }

        public String toString(){
           return String.format("%s-%s-%s", year,month,day);

        }
    }

    //////////////////////////////////////////////////////////////////

}
public class CompositionTst {

    public static void main(String[] args) {
        // TODO code application logic here
        Person person=new Person(2001, 11, 29, "Thilina");
        System.out.println("Name : "+person.getName());
        System.out.println("Birthday : "+person.getBday());

        //The below object cannot be created. A bithday cannot exixts without a Person 
        //Birthday bday=new Birthday(1988,11,10);

    }
}

2

По-перше, ми повинні поговорити про те, що насправді є різницею між собою Aggregationі Compositionмає бути на одній сторінці.

Агрегація - це асоціація, де асоційована особа може існувати незалежно від асоціації. Наприклад, особа може бути асоційована в Організацію, але вона може мати незалежне існування в системі.

тоді як

Склад стосується ситуації, коли одна з асоційованих сутностей сильно пов'язана з іншою і не може існувати без існування іншої. Насправді ідентичність цієї сутності завжди пов'язана з ідентичністю іншого об'єкта. Наприклад, колеса в машині.

Тепер агрегацію можна просто досягти, тримаючи властивість одного суб'єкта господарювання в іншому, як показано нижче:

class Person {
    Organisation worksFor;
}

class Organisation {
    String name;
}

class Main {
    public static void main(String args[]) {

        //Create Person object independently
        Person p = new Person();

        //Create the Organisation independently
        Organisation o = new Organisation();
        o.name = "XYZ Corporation";

        /*
          At this point both person and organisation 
          exist without any association  
        */
        p.worksFor = o;

    }
}

Для композиції необхідно, щоб залежний об'єкт завжди створювався з ідентичністю асоційованого об'єкта. Ви можете використовувати внутрішній клас для того ж.

class Car {
    class Wheel {
        Car associatedWith;
    }
}

class Main {
    public static void main() {
        //Create Car object independently
        Car car = new Car();

        //Cannot create Wheel instance independently
        //need a reference of a Car for the same.
        Car.Wheel wheel = car.new Wheel();
    }
}

Зауважте, що той самий випадок використання може підпадати під агрегацію / склад залежно від сценарію застосування. Наприклад, випадок "Організація з особами" може стати складовим, якщо ви розробляєте заявку для людей, які працюють у якійсь організації, і для реєстрації потрібно посилатися на організацію. Аналогічно, якщо ви ведете інвентар для частин автомобіля, відношення автомобіля-колеса може бути агрегацією.


1

Агрегація проти складу

Агрегація передбачає відносини, коли дитина може існувати незалежно від батька. Наприклад, Банк та працівник, видаліть Банк, а працівник все ще існує.

тоді як склад має на увазі відносини, коли дитина не може існувати незалежно від батьків. Приклад: Людина і серце, серце не існують окремо для людини.

Співвідношення агрегації є "має-має", а склад - "частка".

Склад є сильною асоціацією, тоді як Агрегація є слабкою асоціацією.


0

Обидва типи, звичайно, асоціації, і насправді не чітко відображені на таких мовних елементах. Різниця полягає у призначенні, контексті та способі моделювання системи.

Як практичний приклад, порівняйте два різних типи систем з подібними об'єктами:

  • Система реєстрації автомобілів, яка в першу чергу відстежує автомобілі та їх власників тощо. Тут нас не цікавить двигун як окрема сутність, але ми все ще можемо мати такі атрибути, що стосуються двигуна, як потужність та тип палива. Тут Двигун може бути складовою частиною автомобільної сутності.

  • Система управління автосервісом, яка керує автозапчастинами, обслуговує машини та замінює деталі, можливо комплектуючі двигуни. У нас, можливо, навіть є запасні двигуни і нам потрібно відстежувати їх та інші частини окремо та незалежно від автомобілів. Тут Двигун може бути складеною частиною автомобіля.

Те, як ви реалізуєте це на своїй мові, викликає незначне значення, оскільки на цьому рівні такі речі, як читабельність, є набагато важливішими.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.