Java子类验证设计模式



我有一个基类C,其中包含字段XYZ

C1扩展了C并且具有额外的字段T

C1构造函数中,我确实使用字段XYZ的一些硬编码值来调用super(C)构造函数。然后我设置了T

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

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

谢谢。

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

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

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

中工作

我认为超级类应该验证自己。一个对象需要强制执行它自己的契约。对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;
    }
}
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**//
        }
    }
}

最新更新