可視性とパッケージ設計 — モジュール分離
Javaでは アクセス修飾子(public / private / protected / default) と パッケージ構造 を組み合わせることで、コードの見通しを良くし、モジュールを分離できます。
「外部に見せる部分」と「内部で隠す部分」を整理するのがポイントです。
可視性(アクセス修飾子)
| 修飾子 | アクセス範囲 | 主な用途 |
|---|---|---|
| public | どこからでもアクセス可能 | 外部API、公開クラス |
| private | 同じクラス内のみ | 内部状態の隠蔽 |
| protected | 同じクラス+サブクラス+同じパッケージ | 継承先にだけ公開 |
| default(指定なし) | 同じパッケージ内のみ | パッケージ内部のみに限定 |
👉 原則: 外部に見せる必要がないものは隠す。
パッケージ設計の基本
- パッケージ: クラスをグループ化する仕組み。
package com.example.service;のように宣言。 - 役割ごとに分ける:
model→ データ構造service→ ビジネスロジックrepository→ 永続化処理util→ ユーティリティ
👉 モジュール分離: 役割ごとにパッケージを分け、外部に公開するクラスだけ public にする。
例題で練習
例題1: パッケージ分割と可視性
// ファイル: com/example/model/User.java
package com.example.model;
public class User {
private String name; // 外部から直接触れない
public User(String name) { this.name = name; }
public String getName() { return name; }
}
Java// ファイル: com/example/service/UserService.java
package com.example.service;
import com.example.model.User;
public class UserService {
public void greet(User u) {
System.out.println("Hello " + u.getName());
}
}
Java👉 Userはpublicで外部に公開。フィールドはprivateで隠蔽。
例題2: パッケージ内部だけで使うクラス
// ファイル: com/example/util/Helper.java
package com.example.util;
class Helper { // default(指定なし)
static void log(String msg) {
System.out.println("[LOG] " + msg);
}
}
Java👉 Helperは同じパッケージ内でしか使えない。外部には見せない。
例題3: protectedで継承先にだけ公開
package com.example.base;
public class Animal {
protected void speak() { System.out.println("???"); }
}
package com.example.child;
import com.example.base.Animal;
public class Dog extends Animal {
@Override
protected void speak() { System.out.println("ワン"); }
}
Java👉 外部には公開しないが、継承先では利用可能。
テンプレート集
パッケージ宣言
package com.example.module;
Java公開クラス
public class ClassName { ... }
Java非公開クラス(パッケージ内限定)
class InternalHelper { ... }
Javaフィールドのカプセル化
private 型 フィールド;
public 型 getフィールド() { return フィールド; }
Java設計の指針
- 外部API: public クラス+public メソッド。
- 内部実装: private フィールド、default クラス。
- 継承用: protected メソッド。
- パッケージ分離: 役割ごとに整理し、依存方向を一方通行に。
まとめ
- 可視性: public / private / protected / default を使い分けて「見せる/隠す」を制御。
- パッケージ設計: 役割ごとに分け、外部に公開するクラスだけ public に。
- モジュール分離: 内部実装を隠すことで保守性・拡張性が高まる。
👉 練習課題として「ECサイト」を想定し、model に商品クラス、service に注文処理、repository にデータ保存を分けてみると、パッケージ設計の効果が体感できます。
