2013-02-20 40 views
2

我有类Validator,它管理文件和数据库的所有验证条件。但这个标准由装载机像这样装:如何区分类的实例?

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); 
     ... 
    } 
} 

我需要知道在进口商类,其Validator是为客户,这对于地址...任何好的方法?

+0

为什么不在Validator中创建一个描述字段来存储“客户端”或“地址” – PbxMan 2013-02-20 07:51:22

回答

0

为什么不在getSource()中的Validator当Loader加载源时会被设置。

更多地考虑以下具体问题:

我需要进口商班才知道,这是验证客户端的, 这对于地址...有什么好办法?

其实更好的办法来做到这一点是如果Loader可以返回客户端地址的ClientValidator(实施验证)和AddressValidator
这样可以避开if-else条件,并直接对Validator

1

最好的办法是让你成为一个领域和相应的方法添加到Validator返回标识符(例如"clients")调用validate与它被创建。

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

我们将需要更多的信息,比如什么Loader不正是什么Validator是,你被允许多少能提供更具体的答案之前改变他们的代码。

编辑:

坦率地说,也许你应该重新考虑你的数据模型的重新设计。就目前而言,您可以在不进行任何检查的情况下显式混合客户端和地址。您应该重构代码以便能够依赖Java的类型安全特性。

一种方法是有一个泛型类/接口Validator<T>,其中T将班里的验证对象:

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

然后,您可以有具体的Data子类为您的数据,如AddressClient

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

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

这是更加安全日:,并通过特定的方法来设置类型Validator对象Importer在单个可变方法调用中混合所有验证器对象,并且它也是野外最常见框架的首选方法。

0

将验证器通过位置。在使用之前,您还必须检查特定验证程序是否为空。

public void validate(Data data, 
    Validator clientsValidator, 
    Validator addressValidator) { 
    ... 
    if (clientsValidator != null) { 
     validateClient(data, clientsValidator); 
    } 
    if (addressValidator != null) { 
     validateAddress(data, addressValidator); 
    } 
    ... 
}