Perbedaan implementasi antara Agregasi dan Komposisi di Jawa


102

Saya menyadari perbedaan konseptual antara Agregasi dan Komposisi. Bisakah seseorang memberi tahu saya perbedaan implementasi di Java antara mereka dengan contoh?


3
Ikuti tautan ini Anda mungkin mendapatkan jawaban untuk posting Anda [Perbedaan antara Agregasi dan Komposisi] [1] [1]: stackoverflow.com/a/1468285/1353243
gks

kemungkinan duplikat Agregasi versus Komposisi
Alex K


Ketika kita memiliki hubungan antar objek, itu disebut Asosiasi. Agregasi dan Komposisi keduanya merupakan bentuk Asosiasi khusus. Komposisi lagi-lagi mengkhususkan bentuk Agregasi. javabench.in/2011/08/difference-between-association.html
Raúl

Anda dapat menemukan lebih banyak jawaban di sini
hamed moosaei

Jawaban:


222

Komposisi

final class Car {

  private final Engine engine;

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

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

Pengumpulan

final class Car {

  private Engine engine;

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

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

Dalam hal komposisi, Mesin sepenuhnya dikemas oleh Mobil. Tidak ada cara bagi dunia luar untuk mendapatkan referensi ke Mesin. Mesin hidup dan mati bersama mobil. Dengan agregasi, Mobil juga menjalankan fungsinya melalui Mesin, tetapi Mesin tidak selalu merupakan bagian internal Mobil. Mesin mungkin tertukar, atau bahkan dilepas seluruhnya. Tidak hanya itu, dunia luar masih bisa memiliki referensi ke Mesin, dan mengotak-atiknya terlepas dari apakah itu di dalam Mobil.


7
Contoh yang bagus! Ini juga menunjukkan komposisi sebagai asosiasi yang kuat (Mobil tidak masuk akal tanpa Mesin) dan agregasi sebagai asosiasi yang lemah (Mobil tanpa Mesin benar-benar masuk akal, bahkan tidak memerlukannya dalam konstruktornya). Yang mana yang akan digunakan? Tergantung konteksnya.
Federico Pugnali

@Anand contoh yang Anda berikan di Agregasi bukankah ini contoh ketergantungan? Ketergantungan adalah bentuk hubungan yang lebih lemah dan dalam istilah kode menunjukkan bahwa kelas menggunakan parameter lain atau tipe kembalian.
OOkhan

@Anand: dapatkah Anda menjelaskan lebih lanjut mengapa Anda berkata: dalam kasus komposisi tidak ada cara bagi dunia luar untuk mendapatkan referensi ke Engine, dengan agregasi dunia luar dapat memiliki referensi ke Engine? Dapatkah Anda menunjukkan dalam contoh kode, bagaimana dunia luar dapat atau tidak dapat memiliki referensi ke mesin? terima kasih
O Connor

9
Ini bukan contoh yang benar. Dunia luar dapat memiliki akses ke objek dalam tetapi identitasnya selalu dikaitkan dengan objek luar sementara secara agregat objek dalam mungkin ada secara independen meskipun tidak ada mobil. Dalam hal ini mesin masih dapat dibuat menggunakan new Engine(EngineSpecs)panggilan meskipun tidak ada mobil. Cara untuk mencapai komposisi adalah dengan membuat Engine sebagai kelas dalam, sehingga objek mesin selalu dibuat dengan mengacu pada Objek Mobil
mickeymoon

@ickmoon hasil tangkapan yang bagus. dapatkah Anda menunjukkan contoh yang lebih baik kepada kami?
Gayan Weerakutti

19

Saya akan menggunakan contoh UML yang bagus.

Ambil universitas yang memiliki 1 hingga 20 departemen berbeda dan setiap departemen memiliki 1 hingga 5 profesor. Ada hubungan komposisi antara Universitas dan departemennya. Ada hubungan agregasi antara departemen dan 'profesornya.

Komposisi hanya agregasi KUAT, jika universitas dihancurkan maka jurusan juga harus dimusnahkan. Tapi kita tidak boleh membunuh profesor bahkan jika departemennya menghilang.

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

Sesuatu di sekitar ini.


Saya harap saya tidak akan mendapatkan komentar tentang daftar tidak initilized dan tidak ada konstruktor. Saya menulis ini dengan cepat, bagian yang hilang adalah akal sehat tetapi jika ditanya saya akan menyelesaikan solusinya
TecHunter

Terima kasih! Teladan Anda sangat jelas. Tetapi saya tidak dapat memahami ilustrasi kode Anda. Dapatkah Anda memberi tahu saya perbedaan penerapan dasar antara keduanya? Jika saya harus menerapkan Agregasi atau komposisi, konsep apa di Java yang harus saya gunakan?
Rajath

Ini adalah implementasi yang persis sama jika Anda berbicara tentang kelas TETAPI komposisi harus tercermin dengan cara Anda mengelola instance seperti di edit saya
TecHunter

4

Ada penjelasan bagus di url yang diberikan di bawah ini.

masukkan deskripsi gambar di sini

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

Silakan periksa !!!


Hai Rahul, meskipun tautan ini mungkin menjawab pertanyaan itu, lebih baik menyertakan bagian penting dari jawabannya di sini dan menyediakan tautan untuk referensi. Jawaban link saja bisa menjadi tidak valid jika halaman tertaut berubah. Silakan lihat di sini: Mengapa dan bagaimana beberapa jawaban dihapus?
bummi

3

Perbedaannya adalah bahwa komposisi apa pun adalah agregasi dan bukan sebaliknya.

Mari kita atur persyaratannya. Agregasi adalah metrik dalam standar UML, dan berarti komposisi KEDUA dan agregasi bersama, cukup dinamai bersama . Terlalu sering itu salah disebut sebagai "agregasi". BURUK, karena komposisi adalah agregasi juga. Seperti yang saya mengerti, yang Anda maksud adalah "berbagi".

Lebih jauh dari standar UML:

komposit - Menunjukkan bahwa properti digabungkan secara gabungan, yaitu, objek gabungan memiliki tanggung jawab atas keberadaan dan penyimpanan objek yang disusun (bagian).

Jadi asosiasi universitas ke cathedra adalah sebuah komposisi, karena cathedra tidak ada diluar universitas (IMHO)

Semantik akurat dari agregasi bersama bervariasi menurut area aplikasi dan pemodel.

Yaitu, semua asosiasi lainnya dapat ditarik sebagai agregasi bersama, jika Anda hanya mengikuti beberapa prinsip Anda atau orang lain. Lihat juga di sini .


3

Secara sederhana:

Baik Komposisi dan Agregasi adalah Asosiasi. Komposisi -> Agregasi hubungan Has-A yang kuat -> Hubungan Has-A yang lemah.


2

Program Komposisi sederhana

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

Pertama kita harus berbicara tentang apa sebenarnya perbedaan antara Aggregationdan Compositionberada pada halaman yang sama.

Agregasi adalah asosiasi di mana entitas terkait mungkin ada, terlepas dari asosiasi. Misalnya, Seseorang mungkin terkait dengan sebuah Organisasi tetapi dia mungkin memiliki keberadaan independen dalam sistem.

sedangkan

Komposisi mengacu pada situasi ketika salah satu entitas terkait sangat terkait dengan yang lain dan tidak dapat ada tanpa keberadaan yang lain. Padahal identitas entitas itu selalu dikaitkan dengan identitas objek lainnya. Misalnya roda di dalam mobil.

Sekarang, agregasi dapat dengan mudah dicapai dengan memegang properti dari satu entitas di entitas lain seperti di bawah ini:

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;

    }
}

Untuk Komposisi, objek dependen selalu dibuat dengan identitas objek terkaitnya. Anda dapat menggunakan kelas dalam untuk hal yang sama.

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

Harap dicatat bahwa kasus penggunaan yang sama mungkin termasuk dalam agregasi / komposisi tergantung pada skenario aplikasi. Misalnya, kasus Organisasi-Orang dapat menjadi komposisi jika Anda mengembangkan aplikasi untuk orang-orang yang bekerja di suatu organisasi dan referensi ke organisasi harus untuk mendaftar. Demikian pula, jika Anda memelihara inventaris untuk suku cadang Mobil, hubungan Roda-Mobil dapat berupa agregasi.


1

Agregasi vs Komposisi

Agregasi menyiratkan hubungan di mana anak dapat hidup secara independen dari orang tua. Misalnya Bank dan Pegawai, hapus Bank dan Pegawai tetap ada.

sedangkan Komposisi menyiratkan hubungan di mana anak tidak bisa ada secara independen dari orang tua. Contoh: Manusia dan hati, hati tidak ada terpisah dari Manusia.

Relasi agregasi adalah relasi “has-a” dan komposisinya adalah relasi “bagian-dari”.

Komposisi adalah Asosiasi yang kuat sedangkan Agregasi adalah Asosiasi yang lemah.


0

Kedua jenis ini tentu saja merupakan asosiasi, dan tidak benar-benar dipetakan secara ketat ke elemen bahasa seperti itu. Perbedaannya terletak pada tujuan, konteks, dan bagaimana sistem dimodelkan.

Sebagai contoh praktis, bandingkan dua jenis sistem dengan entitas serupa:

  • Sistem registrasi mobil yang utamanya melacak mobil, dan pemiliknya, dll. Di sini kami tidak tertarik pada mesin sebagai entitas terpisah, tetapi kami mungkin masih memiliki atribut terkait mesin, seperti daya, dan jenis bahan bakar. Di sini Mesin mungkin merupakan bagian gabungan dari entitas mobil.

  • Sistem manajemen bengkel mobil yang mengatur suku cadang mobil, memperbaiki mobil, dan mengganti suku cadang, mungkin mesin lengkap. Di sini kami bahkan mungkin memiliki stok mesin dan perlu melacaknya dan bagian lain secara terpisah dan tidak bergantung pada mobil. Di sini Mesin mungkin merupakan bagian gabungan dari entitas mobil.

Bagaimana Anda menerapkan ini dalam bahasa Anda menjadi perhatian kecil karena pada tingkat itu hal-hal seperti keterbacaan jauh lebih penting.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.