Implementierungsunterschied zwischen Aggregation und Komposition in Java

102

Ich bin mir der konzeptionellen Unterschiede zwischen Aggregation und Komposition bewusst. Kann mir jemand anhand von Beispielen den Implementierungsunterschied in Java erklären?

Rajath
quelle
3
Folgen Sie diesem Link, Sie erhalten möglicherweise eine Antwort auf Ihre Beiträge [Unterschied zwischen Aggregation und Zusammensetzung] [1] [1]: stackoverflow.com/a/1468285/1353243
gks
mögliches Duplikat von Aggregation versus Zusammensetzung
Alex K
Siehe auch C-
Sharp
Wenn wir eine Beziehung zwischen Objekten haben, nennt man das Assoziation. Aggregation und Zusammensetzung sind beide spezialisierte Formen der Assoziation. Zusammensetzung ist wieder spezialisierte Form der Aggregation. javabench.in/2011/08/difference-between-association.html
Raúl
Weitere Antworten finden Sie hier
hamed moosaei

Antworten:

222

Komposition

final class Car {

  private final Engine engine;

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

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

Anhäufung

final class Car {

  private Engine engine;

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

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

Bei der Zusammensetzung ist der Motor vollständig vom Auto eingekapselt. Es gibt keine Möglichkeit für die Außenwelt, einen Verweis auf den Motor zu erhalten. Der Motor lebt und stirbt mit dem Auto. Bei der Aggregation führt das Auto seine Funktionen auch über einen Motor aus, aber der Motor ist nicht immer ein interner Teil des Autos. Motoren können ausgetauscht oder sogar vollständig entfernt werden. Nicht nur das, auch die Außenwelt kann immer noch einen Bezug zum Motor haben und daran basteln, unabhängig davon, ob er sich im Auto befindet.

Anand
quelle
7
Tolles Beispiel! Es zeigt auch die Zusammensetzung als starke Assoziation (ein Auto macht ohne Motor keinen Sinn) und die Aggregation als schwache Assoziation (ein Auto ohne Motor macht absolut Sinn, es braucht nicht einmal eine in seinem Konstruktor). Welches verwenden? Kommt auf den Kontext an.
Federico Pugnali
@ Und das Beispiel, das Sie in Aggregation geben, ist nicht dieses Abhängigkeitsbeispiel? Die Abhängigkeit ist eine schwächere Form der Beziehung und gibt in Bezug auf den Code an, dass eine Klasse eine andere Klasse nach Parameter oder Rückgabetyp verwendet.
OOkhan
@Anand: Können Sie mehr erklären, warum Sie gesagt haben: Im Falle der Komposition gibt es für die Außenwelt keine Möglichkeit, einen Verweis auf die Engine zu erhalten, bei Aggregation kann die Außenwelt einen Verweis auf die Engine haben? Können Sie im Codebeispiel zeigen, wie die Außenwelt einen Bezug zur Engine haben kann oder nicht? danke
O Connor
9
Dies ist kein korrektes Beispiel. Die Außenwelt kann Zugang zum inneren Objekt haben, aber ihre Identität ist immer mit dem äußeren Objekt verbunden, während das innere Objekt in Aggregation unabhängig existieren kann, selbst wenn es kein Auto gab. In diesem Fall kann mithilfe des new Engine(EngineSpecs)Anrufs auch dann ein Motor erstellt werden , wenn kein Auto vorhanden war. Der Weg, um eine Komposition zu erreichen, besteht darin, Engine als innere Klasse zu erstellen, so dass ein Objekt der Engine immer mit Bezug auf ein
Autoobjekt erstellt wird
@mickeymoon toller Fang. Können Sie uns ein besseres Beispiel geben?
Gayan Weerakutti
19

Ich würde ein schönes UML-Beispiel verwenden.

Nehmen Sie eine Universität mit 1 bis 20 verschiedenen Abteilungen und jeder Abteilung hat 1 bis 5 Professoren. Zwischen einer Universität und ihren Abteilungen besteht eine kompositorische Verbindung. Zwischen einer Abteilung und ihren Professoren besteht eine Aggregationsverbindung.

Die Zusammensetzung ist nur eine STARKE Aggregation. Wenn die Universität zerstört wird, sollten auch die Abteilungen zerstört werden. Aber wir sollten die Professoren nicht töten, selbst wenn ihre jeweiligen Abteilungen verschwinden.

In 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);
     }
}

Etwas um das herum.

TecHunter
quelle
Ich hoffe, ich bekomme keinen Kommentar zu nicht initiierten Listen und keinen Konstruktoren. Ich schrieb dies schnell, die fehlenden Teile sind
gesunder
Vielen Dank! Ihr Beispiel ist völlig klar. Aber ich konnte Ihre Code-Illustration nicht verstehen. Können Sie mir den grundlegenden Implementierungsunterschied zwischen den beiden erklären? Welche Konzepte in Java sollte ich verwenden, wenn ich Aggregation oder Komposition implementieren muss?
Rajath
Es ist genau die gleiche Implementierung, wenn Sie über die Zusammensetzung der Klasse sprechen, ABER sollte sich in der Art und Weise widerspiegeln, wie Sie Instanzen wie in meiner Bearbeitung verwalten
TecHunter
4

Die unten angegebene URL enthält eine gute Erklärung.

Geben Sie hier die Bildbeschreibung ein

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

Bitte prüfen!!!

Rahul Saxena
quelle
Hallo Rahul, obwohl dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. Bitte schauen Sie hier: Warum und wie werden einige Antworten gelöscht?
Bummi
3

Der Unterschied besteht darin, dass jede Komposition eine Aggregation ist und nicht umgekehrt.

Lassen Sie uns die Bedingungen festlegen. Die Aggregation ist ein Metaterm im UML-Standard und bedeutet BEIDE Zusammensetzung und gemeinsame Aggregation, einfach als gemeinsam bezeichnet . Zu oft wird es fälschlicherweise als "Aggregation" bezeichnet. Es ist SCHLECHT, denn Komposition ist auch eine Aggregation. Soweit ich weiß, meinst du "geteilt".

Weiter vom UML-Standard:

zusammengesetzt - Gibt an, dass die Eigenschaft zusammengesetzt aggregiert wird, dh das zusammengesetzte Objekt ist für die Existenz und Speicherung der zusammengesetzten Objekte (Teile) verantwortlich.

Die Assoziation von Universität zu Kathedrale ist also eine Komposition, da Kathedra nicht außerhalb der Universität existiert (IMHO).

Die genaue Semantik der gemeinsamen Aggregation variiert je nach Anwendungsbereich und Modellierer.

Das heißt, alle anderen Assoziationen können als gemeinsame Aggregationen gezeichnet werden, wenn Sie nur einigen Prinzipien von Ihnen oder von jemand anderem folgen. Schauen Sie auch hier .

Gangnus
quelle
3

In einfachen Worten :

Sowohl Zusammensetzung als auch Aggregation sind Assoziationen. Zusammensetzung -> Starke Has-A-Beziehung Aggregation -> Schwache Has-A-Beziehung.

Kvk
quelle
2

Ein einfaches Kompositionsprogramm

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);

    }
}
Thilina Dimantha
quelle
2

Zuerst müssen wir darüber sprechen, was eigentlich der Unterschied zwischen Aggregationund Compositionauf derselben Seite sein soll.

Aggregation ist eine Zuordnung, bei der die zugeordnete Entität unabhängig von der Zuordnung existieren kann. Beispielsweise kann eine Person einer Organisation zugeordnet sein, sie kann jedoch eine unabhängige Existenz im System haben.

wohingegen

Zusammensetzung bezieht sich auf eine Situation, in der eine der assoziierten Einheiten stark mit der anderen verwandt ist und ohne die Existenz der anderen nicht existieren kann. Tatsächlich ist die Identität dieser Entität immer mit der Identität des anderen Objekts verbunden. Zum Beispiel Räder in einem Auto.

Jetzt kann die Aggregation einfach erreicht werden, indem eine Eigenschaft einer Entität in einer anderen wie folgt gehalten wird:

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;

    }
}

Für die Komposition ist es erforderlich, dass das abhängige Objekt immer mit der Identität des zugehörigen Objekts erstellt wird. Sie können eine innere Klasse für dieselbe verwenden.

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();
    }
}

Bitte beachten Sie, dass derselbe Anwendungsfall je nach Anwendungsszenario unter Aggregation / Zusammensetzung fallen kann. Beispielsweise kann der Fall "Person-Organisation" zu einer Zusammensetzung werden, wenn Sie eine Anwendung für Personen entwickeln, die in einer Organisation arbeiten, und der Verweis auf die Organisation für die Anmeldung erforderlich ist. Wenn Sie Inventar für Teile eines Autos führen, kann die Auto-Rad-Beziehung ebenfalls eine Aggregation sein.

Mickeymoon
quelle
1

Aggregation gegen Zusammensetzung

Aggregation impliziert eine Beziehung, in der das Kind unabhängig vom Elternteil existieren kann . Beispiel: Bank und Mitarbeiter, löschen Sie die Bank und der Mitarbeiter ist noch vorhanden.

Während Komposition eine Beziehung impliziert, in der das Kind nicht unabhängig vom Elternteil existieren kann. Beispiel: Mensch und Herz, Herz existiert nicht getrennt von einem Menschen.

Die Aggregationsbeziehung ist "hat-ein" und die Zusammensetzung ist "Teil der" Beziehung.

Die Zusammensetzung ist eine starke Assoziation, während die Aggregation eine schwache Assoziation ist.

shiv
quelle
0

Beide Typen sind natürlich Assoziationen und nicht wirklich streng auf solche Sprachelemente abgebildet. Der Unterschied liegt im Zweck, im Kontext und in der Art und Weise, wie das System modelliert wird.

Vergleichen Sie als praktisches Beispiel zwei verschiedene Systemtypen mit ähnlichen Entitäten:

  • Ein Autokennzeichensystem, das in erster Linie die Autos und ihre Besitzer usw. im Auge behält. Hier interessiert uns der Motor nicht als separate Einheit, aber wir haben möglicherweise immer noch motorbezogene Eigenschaften wie Leistung und Kraftstoffart. Hier kann der Motor ein zusammengesetzter Teil der Fahrzeugeinheit sein.

  • Ein Managementsystem für Autowerkstätten, das Autoteile verwaltet, Autos wartet und Teile ersetzt, möglicherweise komplette Motoren. Hier haben wir möglicherweise sogar Motoren auf Lager und müssen diese und andere Teile getrennt und unabhängig von den Autos nachverfolgen. Hier kann der Motor ein aggregierter Teil der Fahrzeugeinheit sein.

Wie Sie dies in Ihrer Sprache implementieren, ist von untergeordneter Bedeutung, da auf dieser Ebene Dinge wie Lesbarkeit viel wichtiger sind.

User0
quelle