また、複数のコンストラクターがある場合でも、すべての実際の作業を実行するコンストラクターを 1 つだけ使用することをお勧めします。指定コンストラクターという用語は Objective-C に由来しますが、それでも良い考えです。次のように書くとします。
public Person(String f, String l, int a, char g) {
// Use more expressive argument names.
firstName = f;
lastName = l;
age = a;
gender = g;
retired = false;
address = null;
}
次に、引数のないコンストラクターを次のように書き直します。
public Person() {
this(null, null, 0, '?');
// Invoke the designated constructor with those arguments.
retired = false;
address = null;
}
コンストラクターの最初のステートメントが の場合、コンストラクthis(...)
ターはクラスの他のコンストラクターの 1 つを呼び出しています。同様に、コンストラクターの最初のステートメントが の場合super(...)
、親クラスのコンストラクターを呼び出しています。どちらも行わない場合は、それsuper()
が想定されます。
次に、retired
とaddress
は両方のコンストラクターで同じように設定されるため、宣言でそれらを初期化します。
private boolean retired = false;
private String address = null; // If it's a String; it could be its own object type.
そして、false
とnull
はインスタンス変数の初期化のデフォルト値であるため、これらの 2 行を次のように置き換えます。
private boolean retired;
private String address;
後で、エラー チェックを追加できます。たとえば、人々は負の年齢を持っていないので、ステートメントを挿入します
if (a < 0) {
throw new IllegalArgumentException("A Person cannot have a negative age: "
+ a);
}
指定されたコンストラクターの先頭にあると便利です。このように、一度だけ行う必要があります。
Java 列挙型について学ぶと、次のように記述して性別変数をより正確にすることができます。
// Gender is a grammatical term, Sex is a biological term.
public enum Sex {
MALE, FEMALE;
}
Sex
変数の代わりに使用char
しますgender
。