Java アグリゲーション vs コンポジション

Musfirah Waseem 2023年10月12日
  1. Java での合成
  2. Java での集計
  3. 構成と集計
  4. Java でコンポジションを操作する
  5. Java で集計を操作する
Java アグリゲーション vs コンポジション

Java では、アグリゲーションとコンポジションは密接に関連する 2つの概念です。 Composition はクラス間の密接な関連付けですが、集約は弱い関連付けです。

Java での合成

コンポジションとは、基本クラス オブジェクトが別の派生クラス オブジェクトを所有し、派生クラス オブジェクトが基本クラスなしでは存在できない場合です。

たとえば、Human を作成すると、いくつかのサブクラスがあります: 手、脚、心臓です。 人間 オブジェクトが死ぬと、そのすべてのサブパーツは意味のある存在を失います。

Java での集計

集約とは、基本クラス オブジェクトとその派生クラス オブジェクトが独立して存在できる場合です。 たとえば、Player 基底クラスを作成し、そこから Team クラスを派生させた場合、Player オブジェクトが破棄されてもチームは存続します。

同様に、Team が解散した場合、Player は存続し、別のチームに参加できます。

構成と集計

構成 集計
PART-OF 関係または特別な HAS A 関係 HAS A 関係
一方向の依存関係 双方向の依存関係
関連の強いタイプ 弱いタイプの関連付け
子は親クラスに依存しています 子は親クラスに依存しない
UML ダイアグラム表現は黒いひし形です UML ダイアグラム表現は白いひし形です

Java でコンポジションを操作する

import java.io.*;
import java.util.*;
class Job {
  private int pay;
  private int id;

  public int getWage() {
    return pay;
  }
  public void setWage(int pay) {
    this.pay = pay;
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
}
class Person {
  private Job job;

  public Person() {
    this.job = new Job();
    job.setWage(650);
  }
  public int getWage() {
    return job.getWage();
  }
}
class Main {
  public static void main(String[] args) {
    Person person = new Person();
    int salary = person.getWage();
    System.out.println("The wage of the person for a job: " + salary);
  }
}

出力:

The wage of the person for a job: 650

上記のコードは、2つのクラス間の構成の関係を表示します。 コンポジションは、part-of タイプの関係として分類されます。 上記の場合、wagejob の一部です。

両方のクラスに対して、パラメーター化されたコンストラクター、セッター、およびゲッター関数を定義しました。

Java で集計を操作する

import java.io.*;
import java.util.*;

class Bank {
  private String BankName;

  Bank(String name) {
    BankName = name;
  }
  public String getBankName() {
    return BankName;
  }
}

class Employee {
  private String EmployeeName;

  Employee(String name) {
    EmployeeName = name;
  }

  public String getEmployeeName() {
    return EmployeeName;
  }
}
class Main {
  public static void main(String[] args) {
    Bank bank = new Bank("IMF");
    Employee emp = new Employee("Rob");

    System.out.println(emp.getEmployeeName() + " is an employee of the " + bank.getBankName());
  }
}

出力:

Rob is an employee of the IMF

上記のコードは、2つのクラス間の集計の関係を表示します。 集約は、has-a タイプの関係として分類されます。 上記の場合、bank には Rob という名前の従業員がいます。

両方のクラスに対して、パラメーター化されたコンストラクター、セッター、およびゲッター関数を定義しました。

著者: Musfirah Waseem
Musfirah Waseem avatar Musfirah Waseem avatar

Musfirah is a student of computer science from the best university in Pakistan. She has a knack for programming and everything related. She is a tech geek who loves to help people as much as possible.

LinkedIn