コンストラクタ
コンストラクタとは?
コンストラクタとは、インスタンスを生成する際に実行される処理のことです。newする際に実行される処理です。特別なメソッドのようなもので、名前はクラス名と同じです。ただし、戻り値はありません。
例えば、"Date"という名前のクラスがあるとしましょう。
コンストラクタの名前はクラス名と同じで、戻り値がない特別なメソッドのようなものです。
以下のプログラムでは、Dateクラスに処理を追加してみました。year、month、dateという3つのフィールドと、printDateというメソッドです。
mainメソッド側では、Dateクラスのインスタンスを生成して変数dに代入しています。この時にコンストラクタが実行されます。コンストラクタはメモリに実体ができる時に動くということです。但し、このサンプルではコンストラクタには何も処理がないので何も起きません。
変数d経由で、year、month、dateフィールドに値を代入しています。printDateメソッドが実行されて、”2023年12月24日”の日付が出力されます。
では、main側の処理でd.year、d.month、d.dateに値を設定する処理を記述し忘れてしまったらどうなるのでしょう?
Dateクラスの各フィールドが初期化されずにが実行されます。実行結果は以下のようになります。
“0年0月0日”となって、日付としてはふさわしくない結果になります。こうならないようにコンストラクタで初期化しておきませんか?
デフォルトコンストラクタで、フィールドの初期化をしてみました。
コンストラクタはメソッドのようなものなのでに引数を指定することも可能です。引数のないコンストラクタをデフォルトコンストラクタと言います。
先ほどの、year、month、dateに値を設定する処理を、コメントアウトしたmainメソッドをもう一度実行してみます。結果は以下のようになります。
"1970年1月1日"が出力されました。
コンストラクタとは?フィールドの初期化を忘れないための保険です。
でも、前述の例は、”1970年1月1日”というコンピュータの世界で最も古い日付で「デフォルト値を決めただけ」でした。newと同時に任意の日付に初期化できると便利です。それを可能にするのがコンストラクタのオーバーロードです。
コンストラクタのオーバーロード
オーバーロードとは?「同じ名前のメソッドを複数定義すること」でした。コンストラクタも、オーバーロードすることが可能です。引数を指定することができます。
Dateクラスのコンストラクタをオーバーロードしてみました。
引数は、y(年)、m(月)、d(日)の3つです。
main側では、デフォルトコンストラクタと、年、月、日を指定して2つのインスタンスを生成しています。
d1.printDate()では、1970年1月1日と出力されていますが、d2.printDate()では2014年3月3日と出力されています。
コンストラクタのメリット
上記の例では、引数が3つあるコンストラクタだけあれば良いのではないか?と思った方いらっしゃるのではないでしょうか?
この例では、確かにそうなのですが、実際には複数のコンストラクタを持つクラスも存在します。
コンストラクタをオーバーロードすることにはどのような意味があるのでしょうか?別のクラスを使って解説していきたいと思います。
Employee(会社の従業員)クラスです。2つのフィールドを持っています。
- no
- 社員番号
- busho
- 所属部署
また、コンストラクタをオーバーロードしています。
- 引数2つのコンストラクタ
- 社員番号と所属部署でフィールドを初期化
- 引数1つのコンストラクタ
- 社員番号フィールドだけを初期化
例えば、新卒の社会人の場合、入社と同時に所属部署が決まる場合もあります。一方、研修が終わらないと所属が決まらないケースも考えられます。社員番号はほぼ入社と同時に決まるでしょう。
- 社員番号だけ決まっている場合
- 引数1つのコンストラクタを使用
- 所属部署も決まっている場合
- 引数2つのコンストラクタを使用
このようにして、生成するインスタンスの状態に応じてコンストラクタを使い分けることが可能です。
まとめると
- クラスを使う側が様々な方法でオブジェクトを生成できる
- フィールドを初期化する手段をいくつか用意することができる
- 使う側の要求に応じたコンストラクタを用意できる
- 使いやすい、便利なクラスになる
- バグが減る