【Java】newした瞬間に初期化!「コンストラクタ」でコードを激減させるテクニック
はじめに
みなさんどうも、おげんです。
クラスを作って、new でインスタンス化する…。
Javaの基本を学んでいく中で、こんなコードを何度も書いていませんか?
Hero h = new Hero();
h.name = "おげん";
h.hp = 100;今はまだ数行ですが、もしキャラクターのパラメータが20個あったら?
もし100人の村人を作るとしたら?
毎回 new した後にせっせと1行ずつ値を代入するのは、正直言ってめちゃくちゃ面倒くさいですよね。
しかも、「HPをセットし忘れて、いきなりHP0で冒険が始まった!」なんてバグも起きかねません。
そんな「初期設定の悩み」をたった1行で、しかも確実に解決してくれるのが、今回ご紹介する「コンストラクタ(Constructor)」です。
これを使えば、インスタンスが生まれた瞬間に、自動で名前やステータスをセットできるようになります。
「手動」から「全自動」へ。
クラスの扱いをワンランク上のレベルに引き上げていきましょう!
newした後の「代入ラッシュ」をスッキリまとめたい人- インスタンスを作るときに、値の入れ忘れを防ぎたい人
- 「クラス名と同じ名前のメソッドみたいなやつ」の正体を知りたい人
コンストラクタは「キャラ作成画面」である
プログラムの世界で new をしてインスタンスを作ることは、新しい命を誕生させるようなものです。
でも、生まれた瞬間に「名前がない」「HPが設定されていない」というのは、RPGでいえばステータスが真っ白なままフィールドに放り出されるようなもの。
これでは困りますよね。
そこで登場するのが コンストラクタ です。
「生まれた瞬間」に決める
RPGを始めるとき、まず最初に「名前は?」「職業は?」と聞かれる画面が出てきますよね。
あれこそがコンストラクタの役割です。
- これまでのやり方: 赤ちゃんを誕生させた後、後付けで名前をつけたり服を着せたりする(手動)。
- コンストラクタ: 名前や装備が決まった状態で、パッと誕生させる(全自動)。
コンストラクタの2大メリット
- 書き忘れを防ぐ(安全): 「名前を入れないと冒険に出られない(インスタンスを作れない)」というルールを作れるので、バグが減ります。
- コードがスッキリ(効率): 何行も書いていた初期設定が、
newの瞬間のたった1行で終わります。
コンストラクタは、いわば「インスタンス専用の出生届」。
これがあるおかげで、私たちは安心して新しいキャラクターを次々と生み出せるようになるんです。
コンストラクタの書き方ルール
コンストラクタは、一見すると「メソッド」にそっくりですが、「2つの特別なルール」があります。
コンストラクタの鉄則
- 名前は「クラス名」と全く同じにする
- 「戻り値(voidなど)」は書かない
実際のコードで、Heroクラスにコンストラクタを実装してみましょう。
public class Hero {
String name;
int hp;
// これがコンストラクタ!
public Hero(String name, int hp) {
this.name = name; // もらった名前をセット
this.hp = hp; // もらったHPをセット
}
}呼び出し方は new の後ろ!
今までは new Hero() と書いていましたが、コンストラクタを作ると、インスタンス化するときに値を渡せるようになります。
// インスタンス化と同時に初期設定が完了!
Hero h = new Hero("おげん", 100);
System.out.println(h.name + "が誕生した!");
// 出力:おげんが誕生した!「this」って何?
コードの中に出てきた this.name = name; という書き方。
これは、「このクラスの変数(フィールド)」と「引数でもらった値」を区別するための合言葉です。
「この(this)クラスのnameに、引数のnameを入れてね!」という意味になります。
書かなくても存在?「デフォルトコンストラクタ」
ここで一つ、不思議に思いませんか?
「今までの記事ではコンストラクタを書いてなかったのに、なんで new Hero() で動いていたんだろう?」と。
実はJavaには、「コンストラクタが一つも書かれていない場合、中身が空っぽのコンストラクタを勝手に準備してくれる」というお節介(?)な機能があるんです。
これをデフォルトコンストラクタと呼びます。
「自作」すると「お節介」が消える!
ここが最大の注意点です。
自分で一つでもコンストラクタ(引数ありなど)を書くと、Javaはデフォルトコンストラクタを準備してくれなくなります。
- コンストラクタを何も書かない時:
new Hero()→ OK! - 引数ありを作った時:
new Hero()→ エラー!(引数を入れろと怒られる)
「引数なし」も残しておきたい時は?
「名前を決めて作りたい時もあるけど、とりあえず空っぽで作っておきたい時もあるなぁ」という場合は、両方書けばOKです!
public class Hero {
String name;
int hp;
// パターンA:名前を指定して作る出生届
public Hero(String name, int hp) {
this.name = name;
this.hp = hp;
}
// パターンB:とりあえず「名無し」で作る出生届
public Hero() {
this.name = "名無し";
this.hp = 10;
}
}このように、同じ名前で「引数のパターン」が違うコンストラクタを複数作ることを、専門用語でオーバーロードと呼びます。
まとめ:コンストラクタで「安全」を手に入れよう
今回は、インスタンス生成時の初期設定を自動化する 「コンストラクタ」 について学びました。
最後におさらいしておきましょう。
- コンストラクタとは:
newした瞬間に自動で実行される「初期化専用のメソッド」。 - 書き方のルール: 名前はクラス名と同じ。戻り値(voidなど)は書かない。
- 最大のメリット: 「名前がないキャラ」などの不完全なインスタンスが生まれるのを防ぎ、コードもスッキリする!
「自由」よりも「ルール」があなたを助ける
プログラミングを始めたばかりのときは「自由に何でも入れたい」と思うかもしれません。
でも、大きなプログラムになればなるほど、「このデータ(引数)がないと、このインスタンスは作らせない!」という強いルールがあったほうが、ミスが減って開発がラクになります。
コンストラクタを使いこなすことは、プログラムに「秩序」を与えること。
「生まれた瞬間から完璧な状態」を作れるようになれば、あなたのJava力はもう初心者レベルを脱していますよ!
今回も最後まで読んでいただき、ありがとうございました!
