[英]How to distinguish between instances of class?
我有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
接口的不同類的實例,則可以使用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) {
...
}
}
這比在單個可變參數方法調用中混合所有驗證器對象安全得多,並且它也是大多數常見框架的首選方法。
為什么在Loader加載源時在Validator
沒有設置getSource()
的原因。
考慮以下具體問題:
我需要在Importer類中知道,哪個Validator用於客戶端,哪個用於地址...任何好的方法?
實際上,執行此操作的更好方法是,如果Loader可以為客戶端返回ClientValidator
(驗證程序的實現),為地址返回AddressValidator
。
這樣,您可以避免if-else
條件,並直接在Validator
類上調用validate
按位置傳遞驗證器 。 使用前,您還必須檢查特定的驗證器是否為null。
public void validate(Data data,
Validator clientsValidator,
Validator addressValidator) {
...
if (clientsValidator != null) {
validateClient(data, clientsValidator);
}
if (addressValidator != null) {
validateAddress(data, addressValidator);
}
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.