Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该在哪里验证参数?工厂模式,Java_Java_Validation_Abstract Class_Factory Method - Fatal编程技术网

我应该在哪里验证参数?工厂模式,Java

我应该在哪里验证参数?工厂模式,Java,java,validation,abstract-class,factory-method,Java,Validation,Abstract Class,Factory Method,假设我有一个带有抽象生成器的抽象类,这两个类都由3个独立的子类继承: public abstract class Role { protected string name; protected int propertyA; protected int propertyB; protected abstract static class RoleBuilder<T extends Role, B extends RoleBuilder<T,B>

假设我有一个带有抽象生成器的抽象类,这两个类都由3个独立的子类继承:

public abstract class Role {

    protected string name;
    protected int propertyA;
    protected int propertyB;


    protected abstract static class RoleBuilder<T extends Role, B extends RoleBuilder<T,B>> {


        protected T role;
        protected B roleBuilder;

        protected abstract T getRole();
        protected abstract B thisBuilder();

        protected RoleBuilder(Hero h) {

            role = getRole();
            roleBuilder = thisBuilder();

            role.name = h.name;
            role.propertyA = h.propertyA; 
            role.propertyB = h.propertyB;

        }

        public T build() {
            return role;
        }

    }
}

 public class Healer extends Role {

    int propertyC;

    public Healer() {

    }

    public static final class HealerBuilder extends Role.RoleBuilder<Healer, HealerBuilder> {

        @Override protected Healer getRole() {
            return new Healer();
        }

        @Override protected HealerBuilder thisBuilder() {
            return this;
        }

        public HealerBuilder(Hero h) {
            super(h);
        }

        public HealerBuilder setPropertyC(int i) {
            role.propertyC = i;
            return roleBuilder;
        }

     }
}
我应该在哪里验证创建这些对象的参数

  • 在抽象类构造函数(我应该验证Hero对象属性吗,或者如果在创建时验证了对象的属性,我可以假设对象是“安全的”)和子类生成器方法中

  • 在枚举方法中

  • 在调用RoleType.getRole(h)的工厂方法中,我的应用程序的其余部分使用它来实际创建Role类型的对象


经验法则是检查任何公开传递的参数,但您可以跳过包内部的参数,并且您可以确定它们是正确的。因此,如果我将builders&RoleTypes enum包保持私有,并在Factory方法中验证我的参数,则Factory方法是包内唯一公开访问的方法,我应该可以走了?经验法则是检查任何公开传递的参数,但是您可以跳过包内部的参数,并且您确定它们是可以的。因此,如果我将builders&RoleTypes enum包保持私有,并在Factory方法内验证我的参数,这是包内唯一公开访问的方法,我该走了?
public enum RoleTypes {
    BRUISER{
    ...
    },
    DAMAGE_DEALER {
    ...
    },
    HEALER {

        public Healer getRole(Hero h) {
            return new Healer.HealerBuilder(h) 
                    .setPropertyC(h.getC);
                    .build();
        }

    };

    abstract Role getRole(Hero h);
}