HOWTO · Java

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

Java では、集約と合成は、オブジェクトを通じて確立される 2つのクラス間の関係を定義します。

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 という名前の従業員がいます。

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