1. Getter だけを作るべき時
「値の読み取りは必要だが、変更を許可したくない」場合
主な例
- イミュータブル(不変)なオブジェクト
-
final
フィールドで初期化後に変更不可とする場合 - 例:
java.time.LocalDate
のような値オブジェクト
-
- 設定後に変更させたくないプロパティ
- 例:
ユーザーID
、作成日時
など、変更されるべきでないデータ
- 例:
具体例
public class User {
private final String id; // 一度セットされたら変更不可
private String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() { // Getter だけ
return id;
}
public String getName() {
return name;
}
// Setter を用意しないことで id の変更を防ぐ
}
ポイント:
-
id
はfinal
なのでコンストラクタでのみセット可能 -
id
のGetter
はあるがSetter
はなし → 不変性を確保 -
name
は変更可能なのでSetter
を作ることも可能
2. Setter だけを作るべき時
「外部から値の取得を制限し、内部のロジックだけで使用する」場合
主な例
- 値の取得を許可したくない場合
- 例: パスワードのようなセンシティブな情報
- 値を外部に公開したくないが、設定はできる場合
- 例: API 経由で設定はできるが、内部でのみ利用する値
- 特定のロジック内でしか値を使わない場合
- 例: キャッシュの更新フラグ、ログ管理用の変数
具体例
public class SecureUser {
private String password; // 外部に公開したくない
public void setPassword(String password) {
this.password = password;
}
// Getter を作らないことでパスワードの取得を防ぐ
}
ポイント:
-
setPassword
で パスワードを設定 できる - しかし、
getPassword
は作らないので 外部からパスワードを取得できない - セキュリティ対策として有効
3. Getter と Setter の両方を作るべき時
「自由に値を取得・変更できるべき場合」
主な例
- 通常のエンティティや DTO
- 例:
User
、Product
などの ビジネスデータを持つクラス
- 例:
- フォームデータや設定情報
- 例: 画面からの入力を保持するオブジェクト
- 特に不変性が必要ない場合
- 例: キャッシュや一時的な設定を扱うオブジェクト
具体例
public class Product {
private String name;
private double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
ポイント:
-
name
とprice
は 自由に取得・変更できる - 一般的な データ保持用クラス に適している
- DTO(Data Transfer Object)や JavaBean では Getter/Setter を両方持つことが多い
まとめ
作成するメソッド | 使うべきケース |
---|---|
Getter だけ | - 値を変更させたくない(final フィールドなど) - イミュータブルなオブジェクト(User ID 、作成日時 など) |
Setter だけ | - センシティブな情報を外部に公開したくない(password など) - 内部ロジックでのみ使う値(ログイン試行回数 など) |
Getter & Setter 両方 | - 通常のエンティティ(User 、Product など) - 変更可能なオブジェクト(DTO や フォームデータ) |
設計のポイント
- 変更を許可すべきか? → Getter/Setter の有無を決める
- セキュリティや不変性を考慮する → Getter/Setter を制限する
- ビジネスルールを考慮する → 必要な操作だけを提供する