Javaでクラスのインスタンス化とコンストラクについて

f:id:monozukuri-bu:20190724222855j:plain

みちです。
今回は、Javaインスタンス化、コンストラクタについて勉強したいと思います。
その応用として、シングルトンパターンにも挑戦しました。

インスタンス

クラスをもとにオブジェクトを作成することを、インスタンス化と呼びます。
インスタンス化をするにはnew演算子を使います。
オブジェクトは「データ型 変数名」で宣言し、「new クラス名()」によって生成します。

構文

データ型 変数名 = new クラス名();

Data data = new Data();

オブジェクトに対してメソッドを呼び出すには以下の構文を使います。

構文

変数名.メソッド名();

data.method(2);

コンストラク

インスタンス化された時に最初に呼び出されるものです。
コンストラクタは次の2つのルールがあります。

・名前がクラス名と同じ
・戻り値を持たない

構文

class Data {
    int num;
    
    Data(int a) {
        this.num = a;
    }
}

コンストラクタを定義することで、インスタンス化と同時に生成されるオブジェクトに対して、 任意の処理を実行することができます。

コンストラクタを使わない場合

class Data {
    int num;

    void method(int a) {
        num = a;
    }
}
Data a = new Data();
a.method(2);

コンストラクタを使う場合

class Data {
    int num;

    Data(int a) {
        num = a;
    }
    void method(int a) {
        num = a;
    }
}
Data a = new Data(2);

デフォルトコンストラク

クラスにコンストラクタを明示的に定義しなかった場合、自動的にコンストラクタが追加されます。
自動的に追加されたコンストラクタの中身は引数、実装ともに空です。

コンパイル

空っぽのDataクラスを定義しました。

class Data {
}

コンパイル

コンパイル後は、"何もしない"コンストラクタが自動的に追加されていました。

class Data {
    Data() {
    }
}

デフォルトコンストラクタが生成されない例

class A {
    A(int a) {
        System.out.println("A(int a)");
    }
}

class B {
    public static void main(String[] args) throws Exception {
            A a = new A();
    }
}

インスタンス化した時に引数なしのコンストラクタを呼んでいますが、クラスAでは、引数を持ったコンストラクタしかありません。
コンストラクタを明示的に定義した場合、デフォルトコンストラクタが生成されないため、引数を持たないコンストラクタはコンパイル後に生成されません。
生成されないことによって「A a = new A();」で引数を持たないコンストラクタを呼び出せないため、上記のコードはコンパイルエラーとなります。
上記のコードを動かせるようにするには、以下のようにする必要があります。

class A {
    A() {
        System.out.println("A()");
    }
    A(int a) {
        System.out.println("A(int a)");
    }
}

class B {
    public static void main(String[] args) throws Exception {
        A a = new A();
    }
}

シングルトンクラス

プログラム中に生成されるインスタンスが、一つだけであることが保証されるクラスです。

class Singleton {
    private static Singleton a = new Singleton();
    private Singleton(){}
    public static Singleton getInstance() {
        return a;
    }
}

class Main {
    public static void main(String[] args) {
        System.out.println(Singleton.getInstance());
    }
}

Sngletonクラスをインポートした時点でクラス変数が生成されるため、 2行目のprivate static Singleton a = new Singleton();でSingletonクラスのインスタンスが生成されます。
コンストラクタの識別子をprivateにすることにより、外部からの呼び出しが出来ません。
このため、新しいインスタンスを作ることが出来なくなり、プログラム中に生成されるインスタンスが1つであることが保証されます。

このSingletonクラスを使用する際は、SingletonクラスのgetInstance()メソッドを呼び出して、インスタンスを取得します。

まとめ

今回は、インスタンス化とコンストラクタについて勉強しました。
シングルトン以外のデザインパターンについても学んでみたいと思います。