2015-04-04 103 views
1

我正在創建一種數據測試程序,其中一個特定部分給了我一大筆麻煩。在我的主要方法類中,有一部分需要將方法中的一個數據字符串作爲參數傳遞給我的方法類(我們稱之爲ValidatorClass),然後這個方法會返回任何驗證錯誤,或者如果沒有簡單的空字符串。返回字符串的方法數組

這樣可以很好,只不過我在使用「for循環」來檢查我的數據來驗證這樣做時沒有太笨重。我試圖研究方法數組,並發現了很多有用的東西,它們與void方法一起工作,但沒有發現任何返回變量的方法。

簡而言之,我問:是否可以創建一個返回變量的方法數組(或實現一個對象數組來模擬一個方法數組)?

下面是一些示例代碼,但在實際編程方法的返回實際上將被進一步上使用的:

public class Validation{ 
    public static void main(String args){ 
     ValidatorClass valTest = new ValidatorClass(); 
     String[] dataList = {"Andrew", "Jameson", "Male"} 

     for(int i = 0; i < dataList.length; i++){ 
      String errors = valTest.testInput(dataList[i], i).validationList[i]; 
      System.out.println(errors); 
     } 
    } 
} 

而且在ValidatorClass:

public class ValidatorClass{ 
    public String testInput(String data, int index){ 
     //Tests the data by calling method "index" which corresponds to data type. 
     //ie. validateName would be index : 1, validateSurname index : 2 etc 
     String errors = validationMethodList[index](data); //Somehow add data as a parameter to it 
     return errors; 
    } 

    public String validateName(String name){ 
     String errors = ""; 
     if(name.length < 1){ 
      errors += "Name Not Entered"; 
     } 
     return errors; 
    } 

    public String validateSurname(String surname){ 
     String errors = ""; 
     if(surname.length < 1){ 
      errors += "Surame Not Entered"; 
     } 
     return errors; 
    } 

    public String validateGender(String gender){ 
     String errors = ""; 
     if(!gender.equalsIgnoreCase("male") || !gender.equalsIngoreCase("female")){ 
      errors += "Invalid Gender"; 
     } 
     return errors; 
    } 
} 
+2

這是一個很不清楚的問題。你可以發佈一些代碼,顯示你正在嘗試做什麼? – 2015-04-04 21:10:58

+3

您不能創建一個方法數組,但是您可以創建一個擴展相同類的對象數組,或者實現具有您需要調用的方法的相同接口。 – yole 2015-04-04 21:12:01

回答

2

我想,你有什麼樣...

static String validate1(Validatible v) { /* do something */ } 
static String validate2(Validatible v) { /* do something else */ } 
static String validate3(Validatible v) { /* do something still else */ } 

而你想執行某些方法...

Validatible v = getValidatible(); 
System.out.println(validate1(v)); 
System.out.println(validate2(v)); 
System.out.println(validate3(v)); 

那麼也許你可以寫一個接口:

public interface Validator { 
    String validate(Validatible v); 
} 

...並保存在一個數組或列表...

private static final List<Validator> validators = Arrays.asList(
    new Validator() { 
    @Override 
    public String validate() { 
     /* do something */ 
    } 
    }, 
    new Validator() { 
    @Override 
    public String validate() { 
     /* do something else */ 
    } 
    }, 
    new Validator() { 
    @Override 
    public String validate() { 
     /* do something still else */ 
    } 
    } 
); 
// Can be written more compactly if in Java 8. 

之後,你可以調用for循環中的方法:

Validatible v = getValidatible(); 
for(Validator validator : validators) { 
    System.out.println(validator.validate(v)); 
} 

可能的改進其中包括使用StringBuilder構建單個字符串(或者使用Stream API並使用Collectors.joining),如果這更符合您的目的。