3

Javaはまだ比較的新しいので、これを処理するより良い方法はどれか疑問に思っています。いくつかのパラメーターを受け取るクラス コンストラクターがあり、このクラスにもパブリック ゲッターとセッターがあります。

private String name;
private Float value;

public MySampleClass(String theName, Float theValue) {
    setName(theName);
    setValue(theValue);
}

public void setName(String n) {
    this.name = n;
}

public value setValue(Float v) {
    this.value = v;
}

この Float の境界チェックを行いたいと思います。それを置くのに最適な場所はセッターにあるようです:

public value setValue(Float v) {
    if (v < 0.0f) {
        this.value = 0.0f;
    } else if (v > 1.0f) {
        this.value = 1.0f;
    }
}

このコードには元々、コンストラクターとセッターで境界チェックがあり、冗長に見えました。セッターを呼び出すようにコンストラクターを変更し、そこにチェックを入れました。それはもっと理にかなっていますか?それとも、私がまったく気づいていない慣習に違反していますか?

4

2 に答える 2

8

コンストラクターからオーバーライド可能なメソッドを呼び出すことは、悪い考えです。次のようにします。

private String name;
private Float value;

public MySampleClass(String theName, Float theValue) {
    this.name = theName;
    setValueImpl(theValue);
}

public void setName(String n) {
    this.name = n;
}

public void setValue(Float v) {
    setValueImpl(v);
}

private void setValueImpl(Float v) {
    if (v < 0.0f) {
        this.value = 0.0f;
    } else if (v > 1.0f) {
        this.value = 1.0f;
    }
}

これにより、両方の場所で検証が行われ、オーバーライド可能なメソッドの呼び出しがなくなります。詳細については、この質問を参照してください。

編集:サブクラス化を計画していて、検証セッターを利用可能にしたい場合は、代わりにMySampleClass宣言してください。protected finalprivate

于 2012-09-13T16:04:46.620 に答える
2

あなたの例のようなかなり単純なデータチェックの場合、はい、セッターで検証を行うのが最も理にかなっています。ただし、の検証theValueも (または他のものに) 依存している場合theNameは、コンストラクター (またはコンストラクターが呼び出すプライベート メソッド) で検証を実行する価値があります。

于 2012-09-13T16:02:40.110 に答える