2012-02-10 11 views
1

フィールドX,YおよびZを持つ基本クラスCを持っています。Javaサブクラス検証デザインパターン

C1Cがあり、追加フィールドがTです。 C1コンストラクタで

、私はフィールドXYZのためのいくつかのハードコードされた値とスーパー(C)コンストラクタを呼び出すください。次に、私はTを設定します。

コンストラクタで何かを行うことによって、C1のすべてのフィールドを自動的に検証するパターンはありますか?だから、私は基本クラスに自動検証をプッシュしようとしています。

スーパーコンストラクタの呼び出しは、C1コンストラクタ内のステートメントの前に行う必要があることに注意してください。私はいくつかの抽象的なvalidate()メソッドから始めましたが、私は正しい軌道にいません。

ありがとうございました。原則として

答えて

0

スーパークラスはそれ自身を検証する必要があります。オブジェクトは、独自の契約を強制する必要があります。 Cの値の検証は、それ自身のコンストラクタで行う必要があります。同様に、サブクラスは自身を検証する必要があります。

public class A { 
    private int x; 

    public A(int x) { 
     if (x < 0) throw new IllegalArgumentException("x cannot be negative"); 
     this.x = x; 
    } 
} 

public class B extends A { 
    private String y; 

    public B(int x, String y) { 
     super(x); 
     if (y == null) throw new IllegalArgumentException("y cannot be null"); 
     this.y = y; 
    } 
} 
+0

したがって、AのメソッドをBで実装されたメソッドから自動的に呼び出す方法はありません.Bのコンストラクタの最後に...右ですか? – user1158641

+0

いいえ、Aはサブクラス化されていることを決して知りません。そのコードはBに属していません。あなたは教授に透視感を与え、未来を予測することを望んでいます:「今から6ヶ月後、フレディは私をサブクラス化するでしょう。私のもの。"クレイジー。 – duffymo

+0

AはBを知らないので不可能です。 –

0
class C{ 
    Object x, y, z; 
    public C(Object x, Object y, Object z){ 
     this.x = x; 
     this.y = y; 
     this.z = z; 
    } 
    public boolean validate(){ /**do stuff**/} 
} 

class D{ 
    public D(/**args**/){ 
     super(/**args**/); 
     if(validate()){ 
      /**do stuff**// 
     } 
    } 
} 
+0

を動作するはずです、私は、基本クラスに検証をプッシュする、自動でそれを行うことを述べるにしたいです。 – user1158641

2

C1は、しかし、Cの専門であるので、Cは、あなたが何ができるか、C1のプロパティについて知るべきではない実装する必要がありますCで抽象validate()メソッドを作るですC1によって。次に、Cのコンストラクタで、抽象メソッドを呼び出すことができます。 C1はvalidate()を実装する必要があるので、そこにプロパティ/フィールド検証を追加できます。

+0

はい、この場合は、Tプロパティを設定する前にC1検証が呼び出されます。これは、私が言及したので、super()コールが最初のステートメントでなければなりません。 – user1158641

+0

その場合、Cコンストラクタが呼び出されたときに自動的に検証することはできませんが、正しいですか?それで、C1クラスの階層構造に追加しているプロパティがC1のものであることを検証させます。 –

+0

私は欲しいものではありません。 – user1158641

1

すべてのオブジェクト指向の原則に反しますが、Javaのリフレクションプロパティを利用できます。リフレクションを使用すると、クラスが持つメソッドやフィールドを見つけることができます。したがって、サブクラスオブジェクトを基本クラスに渡すことができ、基本クラスはすべてのフィールドをチェックして検証することができます。サブクラスコンストラクタの最後でこれを行う場合、検証メソッドに値が有効かどうかを返すことができます。

私はそれが行くための正しい方法だとは思わないが、私は述べたように、それは

+0

"正しい方法ではありません" - はい、うまくいきます。言語には愚かさを禁じるものは何もありません。 – duffymo

+0

最終的にそれが行われます。私はそれが保証されません。これは、あなたが "this"を渡すコンストラクタ内からメソッドを呼び出すと、オブジェクトが最終的に完全に作成されていないため、このメソッドが動作するかどうかわかりません。したがって、これはnullになる可能性があります。それを試してみて、ここに戻って、それがうまくいくかどうかわかってください。ありがとう – guitarflow