3秒でわかる
インスタンスが作られる瞬間に自動で走る初期化用の処理。必要な値を最初に受け取り、中途半端な状態のオブジェクトを生ませない役割を持ちます。
30秒図解
もう少し詳しく
どういうものか
コンストラクタは、クラスからインスタンスを生成するときに自動的に呼ばれる初期化処理です。Java ではクラス名と同じ名前のメソッド、Python では __init__、JavaScript や TypeScript では constructor という名前で書きます。役割は共通していて、フィールドに初期値を入れ、そのオブジェクトが以後正しく振る舞うための前提を整えます。
なぜ必要か
生成した後に setName() や setPrice() を順に呼ぶ方式だと、どれか 1 つを呼び忘れたオブジェクトが世の中に出回ります。壊れているのは生成時点なのに、エラーが出るのは値を使う遥か後ろの行なので、原因を辿るのに時間がかかります。必須の値をコンストラクタの引数にしてしまえば、渡していないコードはそもそもコンパイルできません。
具体例
public class Order {
private final String itemId;
private final int quantity;
public Order(String itemId, int quantity) {
if (quantity <= 0) throw new IllegalArgumentException("数量は1以上");
this.itemId = itemId;
this.quantity = quantity;
}
public Order(String itemId) {
this(itemId, 1); // 別のコンストラクタへ委譲する
}
}class Order:
def __init__(self, item_id, quantity=1):
if quantity <= 0:
raise ValueError("数量は1以上")
self.item_id = item_id
self.quantity = quantityつまずきやすいところ
__init__ で self. を付け忘れると、ローカル変数に代入しただけで終わる似た用語との違い
デストラクタやファイナライザは破棄時の処理で、コンストラクタの対になります。ファクトリメソッドは生成手段に名前を付けたり、条件で返す型を変えたりできる点が違います。
覚え方
「開店準備」です。準備が終わるまで店は開かない、という保証を型の上で表現する仕組みだと考えると使いどころが決まります。