Java - 子类验证设计模式

时间:2012-02-10 10:10:29

标签: java validation design-patterns

我的基类C包含字段XYZ

C1扩展C并且有一个额外字段T

C1构造函数中,我确实将超级(C)构造函数称为字段XYZ的一些硬编码值。然后我设置T

是否有任何模式可以通过在C1构造函数中执行某些操作来自动验证C的所有字段?所以我试图将自动验证推送到基类。

请注意,调用超级构造函数应该在C1构造函数中的任何语句之前完成。我从一些抽象的validate()方法开始,但我不是在正确的轨道上。

感谢。

4 个答案:

答案 0 :(得分:2)

原则上,C不应该知道C1的属性,因为C1是C的特化。但是,你可以做的是在C中创建一个抽象的validate()方法,它必须由C1实现。然后,在C的构造函数中,您可以调用抽象方法。因为,C1必须实现validate(),然后可以在那里添加它的属性/字段验证。

答案 1 :(得分:1)

虽然它违反了所有OO原则,但您可以利用Java的反射属性。通过反射,您可以找出一个类有哪些方法和字段。因此,您可以将子类对象传递给基类,基类可以检查所有字段并验证它们。如果在子类构造函数的末尾执行此操作,则可以让验证方法返回一个值以查看值是否有效。

我想声明我认为这不是正确的方法,但应该有效

答案 2 :(得分: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**//
        }
    }
}

答案 3 :(得分: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;
    }
}