我有类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用于客户端,哪个用于地址......任何好方法?
答案 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
子类,例如Address
或Client
,并通过特定方法将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);
}
...
}