【Java】this/superは毎回必要?

Javaでインスタンスフィールドやメソッドにアクセスする際、thissuper を明示的に書くべきかどうか、悩んだことはありませんか?
この記事では、thissuper の役割と、実務でどのように使い分けるべきかを、Java開発歴10年以上の筆者の経験をもとに解説します。コーディングスタイルの統一や、コードの可読性・保守性の向上を目指す方に最適な内容です。

目次

thissuper の基本をおさらい

Javaでは、クラスの内部からフィールドやメソッドを呼び出す際に、thissuper を使って参照元を明示することができます。

  • this自クラスのフィールドやメソッドを参照
  • super親クラスのフィールドやメソッドを参照

これらは省略可能なケースも多く、毎回書くべきかどうかの判断は、場面ごとに分かれます。

this を書くべき場面

1. ローカル変数とフィールド名が重なるとき

public class User {
    private String name;

    public User(String name) {
        this.name = name; // thisがなければ曖昧
    }
}

引数とフィールド名が同じ場合、this を付けないとローカル変数に値を代入してしまいます。曖昧さを避けるため、このケースでは必ず this を使いましょう
コンストラクタでは引数とフィールド名を同じにすることが多いので、よく使います。

2. 自身のインスタンスを渡すとき

引数:

public class Button {
    public void onClick() {
        EventHandler.handleClick(this);  // 自分自身を引数として渡す
    }
}

自クラスのインスタンスを他クラスの引数として扱えます。

戻り値:

public class User {
    private String name;

    public User setName(String name) {
        this.name = name;
        return this; // チェーンのための戻り値
    }
}

メソッドチェーンでは this を返すのが定番です。Builderパターンなどでも多用されます。

3. 自クラスのコンストラクタを呼び出すとき

public class User {
    private String name;

    public User() {
        this("test");
    }

    public User(String name) {
        this.name = name;
    }
}

this(...)自クラスの他のコンストラクタ を呼び出す特別な構文です。
必ず コンストラクタの最初の行 に書く必要があります。

4. 可読性や明示性を高めたいとき

大規模なクラスや複雑な処理の中では、あえて this を書くことで「インスタンス変数である」ことを明示できます。チームのスタイルガイドに従って統一するのが理想です。

super を書くべき場面

1. オーバーライドした親クラスのメソッドを呼ぶとき

class Parent {
    void greet() {
        System.out.println("Hello from Parent");
    }
}

class Child extends Parent {
    void greet() {
        super.greet(); // 親クラスのgreet()を呼ぶ
        System.out.println("Hello from Child");
    }
}

super を使うことで、親クラスの処理を明示的に呼び出すことができます。特にテンプレートメソッドパターンなど、親子クラスで処理を分担する際に重宝します。

2. 親クラスのコンストラクタを明示的に呼び出すとき

class Parent {
    Parent(String name) {}
}

class Child extends Parent {
    Child() {
        super("default name"); // 親クラスの初期化
    }
}

super() は親クラスのコンストラクタ呼び出しに使います。親クラスに引数付きのコンストラクタしかない場合は必須です。

毎回書くべきではない理由

1. 冗長になりやすい

以下のようなコードは、実用上は過剰です。

this.name = "Alice";
this.age = 30;
this.sayHello();

明らかにフィールドやメソッドであることがわかる場合、this を毎回付けると、かえってノイズとなり可読性を下げることがあります。

2. IDEが補完・警告してくれる

現代の開発環境(IntelliJ IDEA や Eclipse)は、thissuper の省略による曖昧さを警告してくれます。IDEの支援を活用することで、不要な明示を避けられます。

チーム開発ではスタイルを統一しよう

基本的にはthis の使用は曖昧さ回避のためのみに限定することが多いですが、プロジェクトによっては「常に this をつける」方針を採る場合もあります。

つまり、明示的に使うかどうかはプロジェクト・チームで統一することが大切です。

まとめ:thissuper は必要なときだけ明確に使う

  • thissuper は、必要な場面でのみ明示的に使うべき
  • 曖昧さを避け、可読性・保守性を高める目的で使うのがベスト
  • コーディング規約やチームスタイルに合わせて一貫性を持たせよう。

実務では「毎回 this をつける派」と「必要なときだけつける派」が混在していますが、どちらも「一貫性」が大切です。チームでコードレビューを行う中で、どちらかに揃えていくのが最も健全なスタイルだと感じています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次