🎯

【Java】クラス解説28・thisの使い方3

2024/01/29に公開

thisの使い方3

return thisを使用して、同じインスタンス型のメソッドを連続して呼び出すことができます。

「thisの使い方3」のコード例

public class Main {
    public static void main(String[] args) {
    Fuzi f = new Fuzi(2);

    // return thisを使用しているため可能なメソッドの呼び出し
    int result = f.add(4).multiply(24).getValue();

    System.out.println(result); // 出力結果 -> 144 = (2 + 4) * 24
    }
}
class Fuzi {
    private int value;

    public Fuzi(int value) {
        this.value = value; // 2 = 2
    }

    public Fuzi add(int x) {
        this.value += x; // 6 = 2 + 4
        return this;
    }

    public Fuzi multiply(int y) {
        this.value *= y; // 144 = 6 * 24
        return this;
    }

    public int getValue() {
        return this.value; // 144
    }
}

コード例の解説

public class Main {
    public static void main(String[] args) {
    Fuzi f = new Fuzi(2);

    // return thisを使用しているため可能なメソッドの呼び出し
    int result = f.add(4).multiply(24).getValue();

    System.out.println(result);  
    }
}

Mainクラスで、

  1. 実引数で2を渡すコンストラクタを呼び出すインスタンスfを定義します。
  2. インスタンスfから、実引数で4を渡すaddメソッドを呼び出し返り値を受け取り、実引数で24を渡すmultiplyメソッドを呼び出し返り値を受け取り、getValueメソッドを呼び出し受け取った返り値を、変数resultに代入します。return thisの使用により、可能となるメソッドの呼び出し方法。)
  3. 標準出力に変数resultを出力します。

class Fuzi {
    private int value;

    public Fuzi(int value) {
        this.value = value; // 2 = 2
    }

    public Fuzi add(int x) {
        this.value += x; // 6 = 2 + 4
        return this;
    }

    public Fuzi multiply(int y) {
        this.value *= y; // 144 = 6 * 24
        return this;
    }

    public int getValue() {
        return this.value; // 144
    }
}

Fuziクラスで、

  1. インスタンス変数valueを定義します。
  2. 仮引数valueを受け取るコンストラクタを定義します。
  3. インスタンス変数に、仮引数から受け取った2を代入します。
  4. 戻り値の型がFuzi型の仮引数xを受け取るaddメソッドを定義します。
  5. インスタンス変数2に仮引数からの4を足した6をインスタンス変数に再代入します。
  6. 戻り値としてthis(=インスタンスf)が返されます。
  7. 戻り値の型がFuzi型の仮引数yを受け取るmultiplyメソッドを定義します。
  8. インスタンス変数6に仮引数からの24を掛けた144をインスタンス変数に再代入します。
  9. 戻り値としてthis(=インスタンスf)が返されます。
  10. 戻り値の型がint型のgetValueメソッドを定義します。
  11. 戻り値として144が代入されたインスタンス変数を返します。

return thisによるf.add(4).multiply(24).getValue()の変化のイメージ

上記の説明だけではコードの流れが分かりずらい場合は、下記を参考にしてください。

メリットとデメリット

今回のreturn thisを用いてメソッドを呼び出すことをメソッドチェーンと呼び、
以前の記事のthis()を用いてコンストラクタの呼び出すことをコンストラクタチェーンと呼びます。
どちらも下記のメリットとデメリットを併せ持ちます。

メソッドチェーンのメリット

  1. 可読性と簡潔性:複数のメソッド呼び出しを一行で連続して行うことができ、コードが簡潔で読みやすくなります。
  2. 一貫性の向上:同じオブジェクトに対する一連のメソッド呼び出しを結合し、一貫性を提供します。

メソッドチェーンのデメリット

  1. 可読性の低下:過度なメソッドチェーンは可読性を低下させる可能性があります。特にメソッドの数が多い場合、どのメソッドが呼び出されているかを理解するのが難しくなることがあります。
  2. デバッグの複雑化:メソッドチェーン内でエラーが発生した場合、どのメソッドが問題を引き起こしているのかを特定することが難しくなります。

コンストラクタチェーンのメリット

  1. 可読性:オブジェクトの作成時に初期値を指定するコードが自然で読みやすくなります。
  2. 初期化の一貫性:オブジェクトのインスタンス化と初期化を結合し、初期化の一貫性を提供します。

コンストラクタチェーンのデメリット

  1. 可読性の低下:コンストラクタに多くの引数がある場合、可読性が低下しやすくなります。引数が増えるとどの引数が何を表すのか理解しにくくなります。
  2. 柔軟性の低下:コンストラクタチェーンを使うと、オブジェクトの構造を変更するたびに、新しいコンストラクタを追加する必要があり、柔軟性が低下することがあります。

Discussion