他に何もないときにパラメーターなしのコンストラクターを生成するJavaは、礼儀正しいウェイターがあなたのコートを代わりにしてくれるようなものです。
Javaは、別のバージョンを定義した後もパラメーターなしのコンストラクターを生成しますが、コートをどうするかについて独自の計画があることを明確に示した後、同じウェイターがコートを外すのと同じです。
クラス(不変にしたい)がある場合:
class Person
{
final String firstName;
final String lastName;
そして、コンストラクターを追加します。
Person(String firstName, String lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}
ためとJavaは、デフォルト、パラメータなしのコンストラクタを提供するために、まだあった場合、このコードは、コンパイルすることはできませんfirstName
し、lastName
フィールドがfinalとして宣言されている、まだあなたが呼び出した後、それらが設定されていませんPerson p = new Person()
。
あなたは私に別の実装を提供することを強いています:
private Person()
{
this.firstName = null; // or "", or whatever
this.lastName = null;
}
そして、私はそれを望んでいないので-それは役に立たないので、それに頭蓋骨とクロスボーンを置く傾向があると感じるかもしれません:
@Deprecated
private Person()
{
// don't use this constructor! i don't want it to ever be called!
throw new RuntimeException("Illegal constructor called");
}
しかし、私はまだ他の開発者がメソッドを作成することを禁止することはできません(Person
クラス内で、コンストラクタをプライベートとしてマークすることは役に立ちませんでした):
public static Person createPerson()
{
return new Person(); // this will blow in our face
}
Java(そしてJavaだけでなく)が機能するように動作するという事実のおかげで、この大騒ぎはすべて可能であり、回避されています。
メソッドを定義する場合setCoordinates(int x, int y)
、コンパイラーがパラメーターなしバージョンのメソッドを自動的に受け入れることは期待できません- setCoordinates()
。それは何もしません。
これは、パラメーターのないコンストラクターを期待することとどのように異なりますか?まあ、明らかに、コンストラクターは常に少なくとも1つのことを行います-それはオブジェクトを作成します(または試して死ぬ)。
しかし、オブジェクトをインスタンス化する方法を自分で制御したいです。何をしてもパラメーターなしのコンストラクターを使用するように強制すると、このコントロールが不要になります。