如何区分类的实例?

时间:2013-02-20 07:47:02

标签: java

我有类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用于客户端,哪个用于地址......任何好方法?

3 个答案:

答案 0 :(得分: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子类,例如AddressClient,并通过特定方法将Validator个对象设置为Importer

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

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

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

答案 1 :(得分:0)

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

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

  

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

实际上,更好的方法是,Loader可以为客户端返回ClientValidator(Validator的实现),为地址返回AddressValidator
这样您可以避免if-else条件并直接在validate

上调用Validator

答案 2 :(得分:0)

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

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