Java における依存関係、関連付け、集約、および組み合わせの違いの詳細な説明

黄舟
リリース: 2017-08-10 13:48:47
オリジナル
1515 人が閲覧しました

この記事では、Java の依存関係、関連付け、集約、結合の違いを簡単に説明します。興味のある方は一緒に読んでください。見てください

まず、この本の中でこれら 4 つの関係の定義を見てください:

  •  依存関係はクラス間の接続です。依存関係は、あるクラスが別のクラスの定義に依存していることを示します。たとえば、人 (Personal) は車 (car) と家 (House) を購入できます。これは、Person クラスが Car と House を参照するためです。アソシエーションとは異なり、Person クラスには Car および House タイプの属性はありません。Car および House のインスタンスはパラメータとして buy() メソッドに渡されます。一般に、依存関係はローカル変数、メソッドの仮パラメータ、または静的メソッドの呼び出しとして Java 言語に反映されます。

  •  アソシエーション(関連)関係とは、クラス間の接続であり、あるクラスが別のクラスの属性やメソッドを知ることができます。アソシエーションは双方向または単方向にすることができます。 Java 言語では、通常、関連関係はメンバー変数を使用して実装されます。

  •  集合関係は関連関係の一種であり、強い関連関係です。集合体とは、全体と個人との関係です。例えば、自動車というカテゴリーと、エンジンやタイヤなどの部品カテゴリーとの関係は、全体と個の関係です。関連関係と同様に、集約関係もインスタンス変数を通じて実装されます。ただし、関連付け関係に含まれる 2 つのクラスは同じレベルにありますが、集約関係では 2 つのクラスは等しくないレベルにあり、1 つは全体を表し、もう 1 つは部分を表します。

  •  構成関係は、集合関係よりも強い関連関係の一種です。通常の集約関係では全体を表すオブジェクトがその一部のライフサイクルを担う必要があり、結合関係を共有することができない。全体を表すオブジェクトは、部分オブジェクトを存続させ、場合によっては部分を担当するオブジェクトを消滅させる責任を負う必要があります。全体を表すオブジェクトは、部分を表すオブジェクトを、このオブジェクトのライフサイクルを担当する別のオブジェクトに渡すことができます。言い換えれば、パーツを表すオブジェクトは、各瞬間に 1 つのオブジェクトとのみ組み合わせることができ、後者がライフ サイクルに対して独占的に責任を負います。部品には全体と同じライフサイクルがあります。

- 「Java オブジェクト指向プログラミング」より抜粋

上記の関係の結合度は徐々に強化されます (結合度の概念については後で詳しく説明します。ここで、1 つのクラスが変更されると、 、他のクラスに変化を引き起こします。影響が小さいほど結合は弱く、影響が大きいほど結合は強くなります。定義から、依存関係は実際には比較的弱い関連性、集約は比較的強い関連性、結合はより強い関連性であることがすでにわかっているため、これらを一般的に区別すると、実際には、これら 4 つの関係はすべて関連関係になります。

クラス、ドライバーの 3 つのメソッドは、3 つの異なる形式の依存関係を示します。


class Car { 
  public static void run(){ 
    System.out.println("汽车在奔跑"); 
  } 
} 
class Driver { 
  //使用形参方式发生依赖关系 
  public void drive1(Car car){ 
    car.run(); 
  } 
  //使用局部变量发生依赖关系 
  public void drive2(){ 
    Car car = new Car(); 
    car.run(); 
  } 
  //使用静态变量发生依赖关系 
  public void drive3(){ 
    Car.run(); 
  } 
}
ログイン後にコピー

アソシエーション関係は、通常、メンバー変数を使用して Java で実装されますが、場合によってはメソッド パラメーターの形式で実装されます。 Driver と Car の例を引き続き使用すると、メソッド パラメーター フォームを使用して依存関係や関連性を表現できます。結局のところ、プログラム内でセマンティクスをあまり正確に表現することはできません。この例では、メンバー変数を使用してこの意味を表現します。つまり、車は私の車であり、私はこの車を「所有」しています。メソッド パラメーターを使用して次のことを表現します。車は私のものではありません。私は他人から与えられた車を運転する単なるドライバーであり、この車を使用します。


class Driver { 
  //使用成员变量形式实现关联 
  Car mycar; 
  public void drive(){ 
    mycar.run(); 
  } 
  ... 
  //使用方法参数形式实现关联 
  public void drive(Car car){ 
    car.run(); 
  } 
}
ログイン後にコピー

集計関係は比較的強い関連関係であり、一般に Java ではメンバー変数の形式で実装されます。オブジェクト間には全体と部分の関係があります。たとえば、上記の例では


class Driver { 
  //使用成员变量形式实现聚合关系 
  Car mycar; 
  public void drive(){ 
    mycar.run(); 
  } 
}
ログイン後にコピー

上記のコードに次のセマンティクスが与えられているとします。 車は自家用車であり、ドライバーの所有物の一部です。次に、同じコードが集計関係を表します。集計関係では通常、setter メソッドを使用してメンバー変数に値を割り当てます。

次のセマンティクスが与えられたとします。車はドライバーにとって必須の財産です。車がなくなったら、ドライバーは生きたくなくなるでしょう。そして、ドライバーがドライバーでなくなったら、車は壊れてしまい、他の人は使えなくなります。つまり組み合わせの関係ということになります。一般的には、組み合わせ関係を表現するために、初期化の目的を達成するためにコンストラクターを使用することが多いです。例えば、上記の例では、Car を引数とするコンストラクターを追加します


public Driver(Car car){ 
  mycar = car; 
}
ログイン後にコピー

        所以,关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。

以上がJava における依存関係、関連付け、集約、および組み合わせの違いの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート