簡體   English   中英

如何區分類的實例?

[英]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子類,例如AddressClient ,並通過特定方法將類型化的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM