2

我有类 Validator,它管理来自文件和数据库的所有验证标准。但是这个标准是由 Loader 加载的,如下所示:

Validator validator = Loader.load("clients"); //get all from clients.cfg file

从另一个类中确定当前加载哪些标准的最佳方法是什么?

Importer importer;
Validator clientsValidator = Loader.load("clients");
Validator addressValidator = Loader.load("address"); ...
importer.validate(data, clientsValidator, addressValidator);

public class Importer{
   public void validate(Data data, Validator... validator){
      ...
      validateClient(data, one of validators);
      validateAddress(data, another of validator);
      ...
   }
}

我需要知道在 Importer 类中,哪个 Validator 用于客户端,哪个用于地址......有什么好的方法吗?

4

3 回答 3

1

最好的方法是为您添加一个字段和随附的方法来Validator返回"clients"创建它的标识符(例如)。

或者,如果在调用时使用不同的标识符,Loader.load()您可以返回实现接口的不同类的实例Validator,那么您可以使用该Object.getClass()方法来区分这些类。如果这些类在一个很小的集合中,你甚至可以instanceof直接使用。

在能够提供更具体的答案之前,我们需要更多信息,例如究竟Loader是什么,是什么Validator以及允许您更改多少代码。

编辑:

老实说,也许您应该重新考虑重新设计您的数据模型。就目前而言,您显然可以混合客户端和地址而无需任何检查。您应该重组您的代码,以便能够依赖 Java 的类型安全特性。

一种方法是拥有一个通用类/接口,验证对象的类在Validator<T>哪里:T

public interface Validator<T> {
    public boolean validate(T object);
}

然后,您可以Data为您的数据创建特定的子类,例如Addressor ,并通过特定方法Client将类型化Validator对象设置为:Importer

public class Importer {
    public void addAddressValidator(Validator<Address> validator) {
        ...
    }

    public void addClientValidator(Validator<Client> validator) {
        ...
    }
}

这比在单个可变参数方法调用中混合所有验证器对象要安全得多,而且它也是大多数常见框架的首选方法。

于 2013-02-20T07:51:32.710 回答
0

为什么在 Loader 加载源时不设置getSource()in which。Validator

更多地考虑下面的具体问题:

我需要知道在 Importer 类中,哪个 Validator 用于客户端,哪个用于地址......有什么好的方法吗?

实际上,更好的方法是如果 Loader 可以为客户端和地址返回一个ClientValidator(验证器的实现) 。 这样你就可以避免条件并直接调用类AddressValidator
if-elsevalidateValidator

于 2013-02-20T07:51:13.827 回答
0

按 position 传递验证器。您还必须在使用之前检查特定验证器是否为空。

public void validate(Data data, 
    Validator clientsValidator, 
    Validator addressValidator) {
    ...
    if (clientsValidator != null) {
        validateClient(data, clientsValidator);
    }
    if (addressValidator != null) {
        validateAddress(data, addressValidator);
    }
    ...
}
于 2013-02-20T08:04:46.470 回答