質問
セッターメソッドには引数が1つ必要ですか?通常、セッターメソッドは、オブジェクトの特定のプロパティの値として1つの引数を受け入れます。ブール値である別の引数に依存する妥当性を最初にテストしたい場合、真であれば最初に検証し、そうでなければ値を設定するだけです。
ftpサーバーを介してクライアントから値を取得しています。これらのファイルにはゴミ値が含まれている場合があります。たとえば、#3432838#9のような電話番号。そのため、値を設定する前に、これらの不要な文字を削除する必要があります。セッターメソッドで実行できますか?有効なアプローチですか?
前もって感謝します!
編集:
これは有効ですか:
public void setSomething(String strValue){
if(checkValidity(strValue)){
// set the value
} else {
// set the value to an empty string
}
}
解決
特にJava Beanフレームワークモデルで必要ですが、一般的に必須ではありません。
<!> quot; swith <!> quot;の場合、引数なしでセッターを使用できます。値。
void setCheck()
は、たとえば<!> quot; check <!> quot;を設定するためのものです。真のブール属性。
したがって、たとえ<!> quot; setter <!> quot;でなくてもJava Beanという用語の意味では、他の目的でセッターが使用されることを想像できます。
さらに、JavaBean仕様のセクション7によると、セッターは、たとえば、インデックス付きプロパティに対して複数の引数を持つことができます(インデックス付きプロパティは、値の範囲をサポートします。必要な値を識別するためのインデックスを指定するだけです。)
void setter(int index, PropertyType value); // indexed setter
void setter(PropertyType values[]); // array setter
あなたの場合、有効なアプローチは 実行時例外 :関数の署名。
そうすることで、セッターを既に呼び出している他のすべてのクラスに対して、不要なコンパイル時の例外チェックを行わなくなります。
または、プロパティを制約付きプロパティと見なし、ランタイム以外の例外を追加することもできます。
PropertyVetoExceptionをサポートするには、制約付きプロパティセッターメソッドが必要です。 これは、更新が試行される可能性があることを制約されたプロパティのユーザーに文書化します 拒否されました。 したがって、単純な制約付きプロパティは次のようになります。
PropertyType getFoo();
void setFoo(PropertyType value) throws PropertyVetoException;
必要に応じてVetoableChangeListenerを追加できます。
スニペットに関しては、<!> quot; valid <!> quot;です。 (この質問で述べられているように):
- 検証メソッドでは、ゲッターまたはセッターとは別に検証をキャプチャする必要があります。こうすることで、検証を複数のコンポーネントで再利用する必要がある場合に利用できます。
- すぐに失敗する(セッターに例外を追加するという私の提案)の方が良いです。
他のヒント
Java Bean仕様セッターには1つの引数があります。何らかの理由で別のものを追加すると、セッターとは見なされなくなります。
Setterは、<!> quot; clean up <!> quot;に対して完全に有効です。引数、または無効な場合は例外をスローします。
どうして?入力の検証と検証は、セッターに含めるのに適したバリアントです。ここでの質問は、検証なしでメンバーの設定を許可するかどうかです。
おそらく、使用するフレームワークには標準形式のセッターが必要です(Beanとして使用)。ただし、この方法で制限されていない場合は、これを試すことができます。
他のコードが検証を行うべきであるが間違った値が設定されるべきではないと思う場合は、セッターでアサートを使用することもできます。
本の中で<!> quot; Effective Java 2nd Edition <!> quot; Joshua Bloch(ISBN-13:978-0-321-35668-0)によると、オブジェクトの作成にはBean規約よりもビルダーパターンを使用するのが最適であると述べています。
たとえば(beanパターン):
NutritionFacts cocaCola = new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100);
cocaCola.setSodium(35);
cocaCola.setCarbohydrate(27);
ビルダーパターンの使用法:
NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).
calories(100).
sodium(35).
carbohydrate(27).
build();
ビルダーパターンの実装:
// Builder Pattern
public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;
public static class Builder {
// Required parameters
private final int servingSize;
private final int servings;
// Optional parameters - initialized to default values
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val)
{ calories = val; return this; }
public Builder fat(int val)
{ fat = val; return this; }
public Builder carbohydrate(int val)
{ carbohydrate = val; return this; }
public Builder sodium(int val)
{ sodium = val; return this; }
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
最初の2つの引数が必要な場合。
検証には、早期検証(各<field>
メソッド)または遅延検証(build()メソッド)を使用できます。また、形式はpythonキーと値の初期化のようなものです。