Javaのクラス設計|コンストラクタとgetter/setter
クラス定義、コンストラクタ、フィールド初期化、getter/setter、toString、equalsの基本を学びます。コンストラクタ忘れや可視性の誤りなど失敗例も解説。
結論:クラスは「コンストラクタで初期状態を決め、getter/setterで安全にアクセスする」単位
実務的なJavaクラスは、コンストラクタで必須フィールドを初期化し、アクセサ(getter/setter)で外部からの操作を制御します。toString() はデバッグ用、equals() は値の等価性判定に使います。
コンストラクタ
public class User {
private final String id;
private String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
コンストラクタ名はクラス名と同じで、戻り値型はありません。定義しない場合、引数なしのデフォルトコンストラクタが自動生成されます(他コンストラクタを書くと消えます)。
失敗例:必要なコンストラクタがない
public User(String id, String name) { ... }
User u = new User(); // コンパイルエラー: 引数なしコンストラクタが存在しない
toString と equals
@Override
public String toString() {
return "User{id='" + id + "', name='" + name + "'}";
}
オブジェクト比較では == ではなく equals をオーバーライドします(hashCode もセットが原則)。
失敗例:equals だけオーバーライド
HashMap のキーに使う場合、equals と hashCode の両方を一貫して実装しないと検索に失敗します。
まとめ
クラス設計の基本は不変条件をコンストラクタで保証し、必要な操作だけを公開することです。次回は継承で既存クラスを拡張します。
まとめ
Javaクラスはコンストラクタで初期化し、getter/setterでカプセル化を完成させます。デフォルトコンストラクタの消失とequals/hashCodeのセット忘れは実務でもよくあるミスです。UserやProductクラスを設計してみましょう。
次にやること
id(final)とnameを持つUserクラスにコンストラクタ、toString、equals/hashCodeを実装し、2つの同内容Userがequalsでtrueになるか確認してください。
よくある質問
getter/setterは必須ですか?
IDE生成が多いですが、不変オブジェクトならgetterのみ、record(Java 16+)なら自動生成も検討できます。
final フィールドとは?
一度代入したら再代入不可。コンストラクタで必ず初期化する必要があります。
コンストラクタのオーバーロードは?
引数リストが異なれば複数定義できます。this(...) で別コンストラクタを呼べます。
static 初期化ブロックは?
クラスロード時に1回実行されます。複雑なstaticフィールド初期化に使います。
Lombokは使うべき?
@Getter @Builder 等でボイラープレートを減らせますが、初学者は手書きで構造を理解してから導入がおすすめです。
次に読むべき記事
同カテゴリ「Java」の記事
人気記事
- TS2307: Cannot find module '@components/Widget601' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget591' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget581' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget571' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget561' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget551' or its corresponding type declarations の原因と解決法
学習ルート
体系的に学びたい方はこちらから。
エラー解決コース →あわせて読みたい
- Javaのオブジェクト指向プログラミング前の回
- Javaの継承同じ講座の次の回
- Javaの多態性オーバーライドの応用
- Javaの例外処理コンストラクタでの検証
- Javaプログラミングのベストプラクティスクラス設計