🎯

【Java】クラス解説27・thisの使い方2

2024/01/26に公開

thisの使い方2

this()を使用することにより、クラス内の別のコンストラクタを呼び出すことができます。これにより、冗長なコードを避けることができます。

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

public class Main {
    public static void main(String[] args) {
        // 各コンストラクタを呼び出し
        // 各インスタンスでprintメソッドを呼び出し
        Fuzi fd = new Fuzi();
        fd.print(); // 出力結果 -> Int Value: 0, String Value: Default
    
        Fuzi f1 = new Fuzi(24);
        f1.print(); // 出力結果 -> Int Value: 24, String Value: Fuzi
    
        Fuzi f2 = new Fuzi(2424, "Custom Fuzi");
        f2.print(); // 出力結果 -> Int Value: 2424, String Value: Custom Fuzi
    }
}

class Fuzi {
    private int intValue;
    private String stringValue;

    // デフォルトコンストラクタ
    public Fuzi() {
        // 別のコンストラクタ(引数を2つ受け取るコンストラクタ)を呼び出す
        this(0, "Default");
    }

    // 引数を1つ受け取るコンストラクタ
    public Fuzi(int intValue) {
        // 別のコンストラクタ(引数を2つ受け取るコンストラクタ)を呼び出す
        this(intValue, "Fuzi");
    }

    // 引数を2つ受け取るコンストラクタ
    public Fuzi(int intValue, String stringValue) {
        // 初期化処理
        this.intValue = intValue;
        this.stringValue = stringValue;
    }

    public void print() {
        System.out.println("Int Value: " + intValue);
        System.out.println("String Value: " + stringValue);
    }
}

コード例の解説

public class Main {
    public static void main(String[] args) {
        Fuzi fd = new Fuzi();
        fd.print(); // 出力結果 -> Int Value: 0, String Value: Default
    
        Fuzi f1 = new Fuzi(24);
        f1.print(); // 出力結果 -> Int Value: 24, String Value: Fuzi
    
        Fuzi f2 = new Fuzi(2424, "Custom Fuzi");
        f2.print(); // 出力結果 -> Int Value: 2424, String Value: Custom Fuzi
    }
}

Mainクラスで、

  1. デフォルトコンストラクタを呼び出すインスタンスが代入された変数fdを定義します。
  2. 変数fdからprintメソッドを呼び出す。
  3. 引数を1つ受け取るコンストラクタを呼び出すインスタンスが代入された変数f1を定義します。
  4. 変数f1からprintメソッドを呼び出す。
  5. 引数を2つ受け取るコンストラクタを呼び出すインスタンスが代入された変数f2を定義します。
  6. 変数f2からprintメソッドを呼び出す。

class Fuzi {
    private int intValue;
    private String stringValue;

    public Fuzi() {
        this(0, "Default");
    }

    public Fuzi(int intValue) {
        this(intValue, "Fuzi");
    }

    public Fuzi(int intValue, String stringValue) {
        this.intValue = intValue;
        this.stringValue = stringValue;
    }

    public void print() {
        // 初期化処理
        System.out.println("Int Value: " + intValue);
        System.out.println("String Value: " + stringValue);
    }
}

Fuziクラスで、

  1. インスタンス変数intValueを定義します。
  2. インスタンス変数stringValueを定義します。
  3. デフォルトコンストラクタを定義します。
  4. this()により別のコンストラクタを呼び出します。この時、thisは実引数0"Default"の2つを持っているので、引数を2つ受け取るコンストラクタを呼び出します。
  5. 引数を1つ受け取るコンストラクタをを定義します。
  6. this()により別のコンストラクタを呼び出します。この時、thisは仮引数から渡された24と実引数"Fuzi"の2つを持っているので、引数を2つ受け取るコンストラクタを呼び出します。
  7. 引数を2つ受け取るコンストラクタをを定義します。
  8. 初期化処理として、インスタンス変数intValueに仮引数から渡された変数intValueを代入します。
  9. 初期化処理として、インスタンス変数stringValueに仮引数から渡された変数stringValueを代入します。
  10. printメソッドを定義します。
  11. 標準出力に文字列Int Value:に加え、インスタンス変数intValueに代入された数値を出力します。
  12. 標準出力に文字列String Value:に加え、インスタンス変数stringValueに代入された文字列を出力します。

冗長なコード例

次に、同じ出力結果となる冗長なコード例を紹介します。

public class Main {
    public static void main(String[] args) {
        // 各コンストラクタを呼び出し
        // 各インスタンスでprintメソッドを呼び出し
        Fuzi fd = new Fuzi();
        fd.print();
    
        Fuzi f1 = new Fuzi(24);
        f1.print();
    
        Fuzi f2 = new Fuzi(2424, "Custom Fuzi");
        f2.print();
    }
}

class Fuzi {
    private int intValue;
    private String stringValue;

    // デフォルトコンストラクタ
    public Fuzi() {
        // 初期化処理
        this.intValue = 0;
        this.stringValue = "Default";
    }

    // 引数を1つ受け取るコンストラクタ
    public Fuzi(int intValue) {
        // 初期化処理
        this.intValue = intValue;
        this.stringValue = "Fuzi";
    }

    // 引数を2つ受け取るコンストラクタ
    public Fuzi(int intValue, String stringValue) {
        // 初期化処理
        this.intValue = intValue;
        this.stringValue = stringValue;
    }

    public void print() {
        System.out.println("Int Value: " + intValue);
        System.out.println("String Value: " + stringValue);
    }
}

冗長な部分

冗長な部分は初期化処理が3回も繰り返されている部分です。

public Fuzi() {
    // 初期化処理
    this.intValue = 0;
    this.stringValue = "Default";
}

public Fuzi(int intValue) {
    // 初期化処理
    this.intValue = intValue;
    this.stringValue = "Fuzi";
}

public Fuzi(int intValue, String stringValue) {
    // 初期化処理
    this.intValue = intValue;
    this.stringValue = stringValue;
}

冗長とは

冗長とは、プログラミングでは主にコードが不必要に繰り返されているものを指します。
this()を使う事によって、同じ処理を重複して書かないことによるメンテナンス性と可読性を向上させることができます。

メンテナンス性のコード比較

メンテナンス性の向上について、インスタンス変数が1つ増えてしまった場合の「thisの使い方2のコード例」と「冗長なコード例」の比較部分を抜粋して紹介します。

メンテナンス性の向上・thisの使い方2のコード例の場合(抜粋)

class Fuzi {
    private int intValue;
    private String stringValue;
    private boolean booleanValue; // 新規のインスタンス変数の増加

    public Fuzi() {
        this(0, "Default", false);
    }

    public Fuzi(int intValue) {
        this(intValue, "Fuzi", false);
    }

    public Fuzi(int intValue, String stringValue) {
        this(intValue, stringValue, false);
    }

    public Fuzi(int intValue, String stringValue, boolean booleanValue) {
        // 初期化処理
        this.intValue = intValue;
        this.stringValue = stringValue;
        this.booleanValue = booleanValue; // 新規のインスタンス変数による修正
    }

    public void print() {
        System.out.println("Int Value: " + intValue);
        System.out.println("String Value: " + stringValue);
        System.out.println("Boolean Value: " + booleanValue);
    }
}

メンテナンス性の向上・冗長なコード例(抜粋)

class Fuzi {
    private int intValue;
    private String stringValue;
    private boolean booleanValue; // 新規のインスタンス変数の増加

    public Fuzi() {
        // 初期化処理
        this.intValue = 0;
        this.stringValue = "Default";
        this.booleanValue = false; // 新規のインスタンス変数による修正
    }

    public Fuzi(int intValue) {
        // 初期化処理
        this.intValue = intValue;
        this.stringValue = "Fuzi";
        this.booleanValue = false; // 新規のインスタンス変数による修正
    }

    public Fuzi(int intValue, String stringValue) {
        // 初期化処理
        this.intValue = intValue;
        this.stringValue = stringValue;
        this.booleanValue = false; // 新規のインスタンス変数による修正
    }

    public Fuzi(int intValue, String stringValue, boolean booleanValue) {
        // 初期化処理
        this.intValue = intValue;
        this.stringValue = stringValue;
        this.booleanValue = booleanValue; // 新規のインスタンス変数による修正
    }

    public void print() {
        System.out.println("Int Value: " + intValue);
        System.out.println("String Value: " + stringValue);
        System.out.println("Boolean Value: " + booleanValue);
    }
}

Discussion