Diferencia entre agregación y composición en Java

La agregación y la composición describen el tipo de relaciones entre los objetos cuando se comunican entre sí, esto podría usarse en el diseño de bajo nivel para representar asociaciones entre objetos. En este artículo, vamos a discutir las diferencias entre Agregación y Composición en el lenguaje de programación Java. 

Agregación

Es una forma especial de Asociación donde:

  • Representa la relación de Has-A.
  • Es una asociación unidireccional, es decir, una relación unidireccional. Por ejemplo, un departamento puede tener estudiantes, pero al revés no es posible y, por lo tanto, es de naturaleza unidireccional.
  • En Agregación, ambas entradas pueden sobrevivir individualmente, lo que significa que terminar una entidad no afectará a la otra entidad.
Example of Aggregation in Java

 

Ejemplo:

Java

// Java program to illustrate the 
// Concept of Aggregation
  
// Importing required classes
import java.io.*;
import java.util.*;
  
// Class 1
// Student class
class Student {
  
    // Attributes of student
    String name;
    int id;
    String dept;
  
    // Constructor of student class
    Student(String name, int id, String dept)
    {
  
        // This keyword refers to current instance itself
        this.name = name;
        this.id = id;
        this.dept = dept;
    }
}
  
// Class 2
// Department class contains list of student objects
// It is associated with student class through its Objects
class Department {
    // Attributes of Department class
    String name;
    private List<Student> students;
    Department(String name, List<Student> students)
    {
        // this keyword refers to current instance itself
        this.name = name;
        this.students = students;
    }
  
    // Method of Department class
    public List<Student> getStudents()
    {
        // Returning list of user defined type
        // Student type
        return students;
    }
}
  
// Class 3
// Institute class contains list of Department
// Objects. It is associated with Department
// class through its Objects
class Institute {
  
    // Attributes of Institute
    String instituteName;
    private List<Department> departments;
  
    // Constructor of institute class
    Institute(String instituteName,List<Department> departments)
    {
        // This keyword refers to current instance itself
        this.instituteName = instituteName;
        this.departments = departments;
    }
  
    // Method of Institute class
    // Counting total students of all departments
    // in a given institute
    public int getTotalStudentsInInstitute()
    {
        int noOfStudents = 0;
        List<Student> students;
  
        for (Department dept : departments) {
            students = dept.getStudents();
  
            for (Student s : students) {
                noOfStudents++;
            }
        }
  
        return noOfStudents;
    }
}
  
// Class 4
// main class
class GFG {
  
    // main driver method
    public static void main(String[] args)
    {
        // Creating object of Student class inside main()
        Student s1 = new Student("Mia", 1, "CSE");
        Student s2 = new Student("Priya", 2, "CSE");
        Student s3 = new Student("John", 1, "EE");
        Student s4 = new Student("Rahul", 2, "EE");
  
        // Creating a List of CSE Students
        List<Student> cse_students = new ArrayList<Student>();
  
        // Adding CSE students
        cse_students.add(s1);
        cse_students.add(s2);
  
        // Creating a List of EE Students
        List<Student> ee_students
            = new ArrayList<Student>();
  
        // Adding EE students
        ee_students.add(s3);
        ee_students.add(s4);
  
        // Creating objects of EE and CSE class inside
        // main()
        Department CSE = new Department("CSE", cse_students);
        Department EE = new Department("EE", ee_students);
  
        List<Department> departments = new ArrayList<Department>();
        departments.add(CSE);
        departments.add(EE);
  
        // Lastly creating an instance of Institute
        Institute institute = new Institute("BITS", departments);
  
        // Display message for better readability
        System.out.print("Total students in institute: ");
  
        // Calling method to get total number of students
        // in institute and printing on console
        System.out.print(institute.getTotalStudentsInInstitute());
    }
}

Producción:

Total students in institute: 4

Salida Explicación: En este ejemplo, hay un Instituto que tiene varios departamentos como CSE y EE. Cada departamento tiene no. de estudiantes. Entonces, creamos una clase de Instituto que tiene una referencia a Objeto o no. de Objetos (es decir, Lista de Objetos) de la clase Departamento. Eso significa que la clase Instituto está asociada con la clase Departamento a través de su(s) Objeto(s). Y la clase Departamento también tiene una referencia a Objetos u Objetos (es decir, Lista de Objetos) de la clase Estudiante, lo que significa que está asociada con la clase Estudiante a través de su(s) Objeto(s). Representa una relación Tiene-A. En el ejemplo anterior: Student Has-A name. El estudiante tiene una identificación. Student Has-A Dept. Department Has-A Students como se muestra en los siguientes medios. 

 

¿Cuándo usamos Agregación? 

La reutilización de código se logra mejor mediante la agregación.  

Composición 

La composición es una forma restringida de agregación en la que dos entidades son altamente dependientes entre sí.  

  • Representa parte de la relación.
  • En composición, ambas entidades son dependientes entre sí.
  • Cuando hay una composición entre dos entidades, el objeto compuesto no puede existir sin la otra entidad.

 

Ejemplo:

Java

// Java program to illustrate
// the concept of Composition
  
// Importing required classes
import java.io.*;
import java.util.*;
  
// Class 1
// Book
class Book {
  
    // Attributes of book
    public String title;
    public String author;
  
    // Constructor of Book class
    Book(String title, String author)
    {
  
        // This keyword refers to current instance itself
        this.title = title;
        this.author = author;
    }
}
  
// Class 2
class Library {
  
    // Reference to refer to list of books
    private final List<Book> books;
  
    // Library class contains list of books
    Library(List<Book> books)
    {
  
        // Referring to same book as
        // this keyword refers to same instance itself
        this.books = books;
    }
  
    // Method
    // To get total number of books in library
    public List<Book> getTotalBooksInLibrary()
    {
  
        return books;
    }
}
  
// Class 3
// Main class
class GFG {
  
    // Main driver method
    public static void main(String[] args)
    {
  
        // Creating objects of Book class inside main()
        // method Custom inputs
        Book b1
            = new Book("EffectiveJ Java", "Joshua Bloch");
        Book b2
            = new Book("Thinking in Java", "Bruce Eckel");
        Book b3 = new Book("Java: The Complete Reference",
                        "Herbert Schildt");
  
        // Creating the list which contains number of books
        List<Book> books = new ArrayList<Book>();
  
        // Adding books
        // using add() method
        books.add(b1);
        books.add(b2);
        books.add(b3);
  
        Library library = new Library(books);
  
        // Calling method to get total books in library
        // and storing it in list of user0defined type -
        // Books
        List<Book> bks = library.getTotalBooksInLibrary();
  
        // Iterating over books using for each loop
        for (Book bk : bks) {
  
            // Printing the title and author name of book on
            // console
            System.out.println("Title : " + bk.title
                            + " and "
                            + " Author : " + bk.author);
        }
    }
}

Producción:

Title : EffectiveJ Java and  Author : Joshua Bloch
Title : Thinking in Java and  Author : Bruce Eckel
Title : Java: The Complete Reference and  Author : Herbert Schildt

Salida Explicación: En el ejemplo anterior, una biblioteca puede tener una cantidad de libros sobre los mismos o diferentes temas. Entonces, si la biblioteca se destruye, todos los libros dentro de esa biblioteca en particular serán destruidos. es decir, los libros no pueden existir sin las bibliotecas. Por eso es composición. El libro es parte de la biblioteca.

Diferencia entre agregación y composición en Java

Agregación 

Composición 

La agregación se puede describir como una relación «Tiene-a», que denota la asociación entre objetos. Composición significa que un objeto está contenido en otro objeto. Es un tipo especial de agregación (es decir, tiene una relación), lo que implica que un objeto es el propietario de otro objeto, lo que puede denominarse asociación de propiedad.
Existe una dependencia mutua entre los objetos. Hay una relación unidireccional, esto también se llama relación «parte de».
Es un tipo de asociación débil, ambos objetos tienen su propio ciclo de vida independiente. Es un tipo fuerte de asociación (agregación), el objeto hijo no tiene su propio ciclo de vida. 
El objeto asociado puede existir de forma independiente y tener su propio ciclo de vida.  La vida del niño depende de la vida de los padres. Solo el objeto principal tiene un ciclo de vida independiente.
La representación UML de White Diamond denota agregación. La representación UML de Black Diamond denota composición.
Por ejemplo, la relación entre un estudiante y un departamento. El estudiante puede existir sin un departamento. Por ejemplo, un archivo que contiene una carpeta, si la carpeta elimina todos los archivos dentro serán eliminados. El archivo no puede existir sin una carpeta.

Publicación traducida automáticamente

Artículo escrito por thejavamentor y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *