19.

this

編集

本稿は Java の this キーワードに関する記事です。this「現在実行中のインスタンス自身」を指す参照で、フィールドと引数の名前が衝突したときの区別、コンストラクタ間の呼び出し、ビルダーパターンでの自己返却など、Java で頻繁に登場するキーワードです。

this の主な用途

用途概要
自インスタンスのフィールド参照引数と同名のフィールドを明示的に指す
自インスタンスのメソッド呼び出しthis.method() または省略形 method()
同じクラスの別コンストラクタ呼び出しthis(...) (先頭で 1 回のみ)
自身の参照を返すメソッドチェーン用 (Builder / Fluent API)
匿名内部クラスから外側を指す外側クラス名.this

1. フィールド名と引数名が衝突するとき

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name; // フィールドの name = 引数の name
        this.age  = age;
    }
}

引数名とフィールド名が同じ場合、this. を付けないとローカル変数 (引数) が優先されるためフィールドに代入できません。シャドーイングを明示的に解消するのが this の典型用途です。

2. 同じクラスの別コンストラクタを呼び出す

public class User {
    private final String name;
    private final int age;

    public User(String name) {
        this(name, 0); // 同じクラスの別コンストラクタへ委譲
    }

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

制約: this(...) はコンストラクタ本体の先頭でのみ呼べる、かつ1 つのコンストラクタにつき 1 回までsuper(...) との同時使用は不可。

3. 自身の参照を返す (メソッドチェーン / Builder)

public class StringBuilderLike {
    private final StringBuilder sb = new StringBuilder();

    public StringBuilderLike append(String s) {
        sb.append(s);
        return this;  // 自分を返す
    }
}

new StringBuilderLike().append("Hello").append(", World!");

4. 内部クラスから外側のインスタンスを参照する

public class Outer {
    private int x = 1;

    class Inner {
        private int x = 2;

        void show() {
            System.out.println(this.x);        // 2 (Inner の x)
            System.out.println(Outer.this.x);  // 1 (Outer の x)
        }
    }
}

this を「省略」する場合と「省略しない」場合

場面this を書くべきか
同名の引数・ローカル変数とのシャドーイング必ず付ける
普通のフィールド・メソッド参照省略してよい (多くのコードがそうしている)
意図を明示してフィールドだと示したいチームの命名/書式規約に合わせる
static メソッド内使用不可 (インスタンスが存在しない)

注意点

  • this非 static コンテキストでのみ使える。static メソッド内では使用不可
  • this(...)super(...)コンストラクタ本体の先頭でしか呼べない
  • this参照を外部に渡すのはコンストラクタ実行途中では危険 (フィールド未初期化の状態が公開される。"this の漏洩" / Java Concurrency 上の代表的なバグ)
  • JavaScript の this とは仕様が大きく異なる。混同しない
  • Java 21 などのレコード型 (record) では自動生成のため、明示的に this. を書く場面は減る

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 基本的なルール
  2. データ型
  3. 変数
  4. 定数
  5. 配列
  6. コレクション(List,Set,Queue)
  7. Map(連想配列)
  8. 演算子
  9. 条件分岐
  10. 繰り返し制御文
  11. クラス
  12. メソッド
  13. インスタンス化
  14. コンストラクタ
  15. staticキーワード
  16. オーバーロード
  17. 継承
  18. オーバーライド
  19. this
  20. super
  21. パッケージ
  22. アクセス修飾子
  23. 抽象クラス・メソッド
  24. インターフェース
  25. カプセル化
  26. データベース接続
  27. セッション
  28. ファイル入出力
  29. ラムダ式