Javaの密結合と疎結合の違いとは?コード例でわかりやすく解説
密結合(Tight Coupling)とは、クラスやオブジェクト同士が互いに依存している状態を指します。一般的に密結合は、コードの柔軟性や再利用性を低下させるため、好ましくないとされています。一方、疎結合(Loose Coupling)とは、あるクラスが別のクラスを直接利用する際の依存関係を減らすことを意味します。
密結合(Tight Coupling)とは
- 密結合されたオブジェクトとは、他のオブジェクトに関する情報を知っている必要があり、互いのインターフェースに高度に依存しているオブジェクトのことです。
- 密結合されたアプリケーションでは、1つのオブジェクトを変更すると、他の多くのオブジェクトにも変更が必要になるケースが頻繁に発生します。
- 小規模なアプリケーションであれば変更箇所を容易に特定でき、見落としのリスクも少ないですが、大規模なアプリケーションでは、こうした相互依存関係がすべての開発者に共有されているとは限らず、変更を見逃してしまう恐れがあります。
コード例
class A {
public int a = 0;
public int getA() {
System.out.println("getA() method");
return a;
}
public void setA(int aa) {
if(!(aa > 10))
a = aa;
}
}
public class B {
public static void main(String[] args) {
A aObject = new A();
aObject.a = 100; // クラスAの定義上、許可されていない操作。これが密結合の原因となる
System.out.println("aObject.a value is: " + aObject.a);
}
}上記の例のような実装は密結合であり、非常に好ましくありません。クラスBがクラスAの内部構造まで把握してしまっているためです。仮にクラスAで変数「a」がprivateに変更されると、クラスBはコンパイルエラーとなってしまいます。さらに、クラスAの実装では「変数aは10以下でなければならない」というルールが定められていますが、変数へ直接アクセスして任意の値を設定できてしまうため、このルールを強制する手段が存在しません。
実行結果
aObject.a value is: 100
疎結合(Loose Coupling)とは
- 疎結合とは、システムを構成するコンポーネント間の相互依存を減らし、あるコンポーネントの変更が他のコンポーネントへの変更を引き起こすリスクを低減することを目標とした設計方針です。
- 疎結合はより汎用的な概念であり、システムの柔軟性を高め、保守性を向上させ、フレームワーク全体をより安定させることができます。
コード例
class A {
private int a = 0;
public int getA() {
System.out.println("getA() method");
return a;
}
public void setA(int aa) {
if(!(aa > 10))
a = aa;
}
}
public class B {
public static void main(String[] args) {
A aObject = new A();
aObject.setA(100); // 強制されたルールにより、このメソッド呼び出しは無効となるため 'a' には設定できない
System.out.println("aObject value is: " + aObject.getA());
}
}上記の例のような実装は疎結合であり、推奨される方法です。クラスBは、ルールが適用された状態へアクセスするために必ずクラスAのメソッドを経由する必要があります。そのため、クラスAの内部実装が変更されても、クラスBはクラスAを通信手段としてのみ利用しているだけであり、影響を受けることはありません。
実行結果
getA() method aObject value is: 0
まとめ:密結合と疎結合の比較
| 項目 | 密結合 | 疎結合 |
|---|---|---|
| 依存関係 | クラス間の依存が強い | 依存を最小限に抑える |
| 変更への影響 | 1つの変更が多数のクラスに波及 | 他クラスへの影響が限定的 |
| 保守性・再利用性 | 低下しやすい | 高まる |
| カプセル化 | 破られやすい | 守られる |
Java開発においては、フィールドをprivateにし、getter/setterなどの公開メソッドを通じてのみ状態を操作するなど、疎結合な設計を心がけることで、保守性が高く拡張しやすい堅牢なアプリケーションを構築できます。
-
JavaのJFrameとJDialogの違いとは?特徴と使い分けを解説
JavaのSwingには、ウィンドウを表示するためのトップレベルコンテナとしてJFrameとJDialogが用意されています。どちらもよく似た役割を持ちますが、動作や用途には重要な違いがあります。この記事では、それぞれの特徴をサンプルコードとともに解説し、最後に使い分けのポイントをまとめます。 JFrameとは フレームに追加されたコンポーネントは「コンテンツ」として扱われ、contentPaneによって管理されます。JFrameにコンポーネントを追加する際は、フレーム本体ではなくcontentPaneに対して追加する必要があります。 JFrameは、タイトル、境界線、(オプションで)メニュ
-
JavaのGridLayoutとGridBagLayoutの違いを徹底解説!特徴と使い分けのポイント
JavaのAWT/Swingには複数のレイアウトマネージャーが用意されていますが、その中でもGridLayoutとGridBagLayoutは、コンポーネントを格子状(グリッド)に配置するという点でよく似ています。しかし、両者には重要な違いがあります。 GridLayoutは、すべてのコンポーネントを矩形のグリッド内に配置し、領域を同じサイズの長方形に分割して、各コンポーネントをそれぞれのセルの中に収めます。一方、GridBagLayoutは柔軟性の高いレイアウトマネージャーであり、コンポーネントのサイズを揃えることなく、縦方向・横方向に整列させて配置できます。各GridBagLayoutオブ