我有 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 用于客户端,哪个用于地址...有什么好的方法吗?
最佳答案
最好的方法是为 Validator
添加一个字段和相应的方法返回创建它的标识符(例如 "clients"
)。
或者,如果在调用 Loader.load()
时使用不同的标识符你会得到实现 Validator
的不同类的实例接口(interface),那么你可以使用 Object.getClass()
区分这些类的方法。如果这些类在一个非常小的集合中,你甚至可以使用 instanceof
来逃避直接。
我们需要更多信息,例如 Loader
到底做了什么 Validator
在能够提供更具体的答案之前,您可以更改他们的代码多少。
编辑:
老实说,也许您应该重新考虑重新设计您的数据模型。就目前而言,您显然可以在不进行任何检查的情况下混合使用客户端和地址。您应该重构您的代码,以便能够依赖 Java 的类型安全功能。
一种方法是拥有一个通用类/接口(interface) 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) {
...
}
}
这比在单个可变参数方法调用中混合所有 validator 对象要安全得多,它也是大多数常见框架的首选方法。
关于java - 如何区分类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14974723/