5

セッターメソッドには1つの引数が必要ですか?通常、セッターメソッドは、オブジェクトの特定のプロパティの値として1つの引数を受け入れます。ブール値である別の引数に依存する有効性を最初にテストしたい場合はどうなりますか。trueの場合は最初に検証し、そうでない場合は値を設定します。

ftpサーバーを介してクライアントから値を取得しています。これらのファイルにガベージ値が含まれている場合があります。たとえば、#3432838#9のような電話番号。したがって、値を設定する前に、これらのガベージ文字を削除する必要があります。セッターメソッドで実行できますか?それは有効なアプローチですか?

よろしくお願いします!

編集:

これは有効ですか:

public void setSomething(String strValue){ 
     if(checkValidity(strValue)){ 
         // set the value 
     } else { 
         // set the value to an empty string
     }  
  }
4

4 に答える 4

12

特にJavaBeanフレームワークモデルでは必要ですが、一般的には必須ではありません。

値を「変更」することを意図している場合は、引数なしでセッターを使用できます。

void setCheck()

たとえば、「check」ブール属性をtrueに設定することを意味する場合があります。

したがって、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を追加できます。


スニペットに関しては、「有効」ですが、(この質問で述べたように)次の理由で最適ではない可能性があります。

  • 検証は、検証メソッドでゲッターまたはセッターとは別にキャプチャする必要があります。そうすれば、検証を複数のコンポーネントで再利用する必要がある場合に利用できます。
  • 早く失敗する方が良いです(したがって、セッターに例外を追加するという私の提案)。
于 2008-11-20T13:12:02.373 に答える
5

Java Bean仕様により、セッターには1つの引数があります。別のものを追加すると、何らかの理由で、それはもはやセッターとは見なされません。

セッターは、引数を「クリーンアップ」するか、無効な場合は例外をスローするのに完全に有効です。

于 2008-11-20T13:11:41.703 に答える
2

なぜだめですか。入力の検証と妥当性確認は、セッターに含めるのに適したバリアントです。ここでの問題は、検証なしでメンバーの設定を許可するかどうかです。

おそらく、使用するフレームワーク(Beanとしての使用)には、標準形式のセッターが必要です。ただし、このように制限されていない場合は、これを試すことができます。

他のコードで検証を行う必要があるが、間違った値を設定してはならない場合は、セッターでassertを使用することもできます。

于 2008-11-20T13:14:45.300 に答える
1

Joshua Bloch (ISBN-13: 978-0-321-35668-0) による著書「Effective Java 2nd Edition」では、オブジェクトの作成には 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のキー値の初期化のようなものです。

于 2008-11-20T16:18:19.253 に答える