本を読んで、それを実装するほど明確ではありません。あなたはあなたの特定の状況に知識を考え、適用する必要があります。
それは本当にあなたがあなたのクラスで変数を初期化すると、右のオブジェクトの構築後にそれらを使用している方法によって異なります。
いくつかのポインタ:
例:
は、私たちがオブジェクトに給料の上限を持って言う:
public Employee(int salary) {
if(salary >= this.salaryCap)
this.salary = salary;
}
int salary = 0;
int salaryCap = 1000;
作成時に、あなたは給与額で渡さを検証することができます
また、クラスの関係によって、thを検証するかどうかが決まりますe値であるかどうか。たとえば、継承チェーンのパラメータを継承チェーンに渡す場合、継承チェーン内の他のオブジェクトの状態に影響を与える場合は、それらを検証するために時間がかかります。
例:変数から来ている
public Employee(int salary) {
super(salary); //validate salary against known constraints
}
:私はスーパーのコンストラクタを呼び出す必要がありたび
は、私が検証の入力に誘惑のですか?ソース(SQLパラメータなど)を信頼しない場合は、それらを検証し、さらにコードを実行する前に入力をサニタイズする必要があります。これにより、セキュリティ攻撃が防止されます。
私は常にコンストラクタで検証とパラメータチェックを行うのが疲れています。私は入力を検証するゲッターとセッターを持つことを好みます。そうすれば、オブジェクトの作成時に何かが発生した場合、少なくとも状態が決まらない完全な一貫性のないオブジェクトよりも、半加工オブジェクトの保証があります。もちろん、これはコンテキストによって異なります。制約が厳しい場合は、オブジェクト作成を停止し、クライアント(ユーザー、呼び出しオブジェクトなど)に有効な入力パラメータを要求することができます。
ゲッター/セッターを使用すると、私はオブジェクトが実際のオブジェクトが与える外部インターフェイス上で呼び出すことにより、段階的に構成されていることがあり、例外が発生した作成中に検証を、制約以外のもたらす利点、オブジェクトを使用不能/不安定にします。
だからこれに代えて:
public Employee(int salary) {
if(salary >= this.salaryCap)
this.salary = salary;
}
私はこれを好む:
public class Employee {
public void setSalary(int salary) {
if(salary >= this.salaryCap)
this.salary = salary;
}
}
を、後者はオブジェクトの作成には影響しませんこれは、私にきれいに呼び出し元に有効な例外で終了することができます(私はコンストラクタで例外を投げるのが好きではありません)。
一言で言えば、変数には制約がありますか?はいの場合は、これらの制約を内部データプロパティに設定する前に検証します。
著者は、コンストラクタ内のパラメータを検証するために記述していることをここでお読みになりましたか? – Kwadz