StackShelf
Java 第8回

Javaのクラス設計|コンストラクタとgetter/setter

クラス定義、コンストラクタ、フィールド初期化、getter/setter、toString、equalsの基本を学びます。コンストラクタ忘れや可視性の誤りなど失敗例も解説。

2分で読める
Javaクラスオブジェクトオブジェクト指向プログラミング

結論:クラスは「コンストラクタで初期状態を決め、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」の記事

学習ルート

体系的に学びたい方はこちらから。

エラー解決コース →

あわせて読みたい