2016-09-26 83 views
-1
public void parametersForValidation(String name,String address){ 
validateParameters(name,address); 
} 

private void validateParameters(Object... values){ 
for(Object value:values){ 
Objects.requirNonNull(value,"Value is mandatory"); 
} 
} 

我想要而不是「值是強制性的」,參數名稱如「名稱是namdatory」和「地址是強制性的」應該來。 任何人都可以幫助..感謝在先行我怎樣才能得到參數名稱相同的參數在java

+0

也傳遞參數的名稱,例如,在包含名稱和值的對象中。然後將該名稱連接到該消息,例如像這樣'Objects.requirNonNull(param.getValue(),param.getName()+「是強制性的));'。 – Thomas

+0

如果您使用的是方法參數的名稱,則取決於您的環境,例如,無論您的編譯代碼是否包含名稱(AFAIK僅適用於Java 8+) - 類似於以下內容:http://stackoverflow.com/questions/21455403/how-to-get-method-parameter-names-in-java -8使用反射。如果不能使用Java 8,有些庫通過掛接到構建過程來爲較低的Java版本提供參數名稱。但是在這兩種情況下,您都必須將名稱傳遞給'validateParameters()',因爲該方法不會知道傳遞的是什麼。 – Thomas

+0

謝謝,但我不想像關鍵值對那樣。如果我將地址作爲參數傳遞,那麼我需要字符串格式的參數名稱。 –

回答

0

有沒有這樣的魔術被調用的方法。由於您將傳遞給方法,因此這些參數不包含有關其參數角色的任何信息。實際上,傳遞給validateParameters的值不能保證是調用者上下文中的參數。你可以,例如調用它作爲validateParameters(Math.sin(2), null)validateParameters(bufferedReader.readLine())並且不清楚,當它遇到null時,該方法應爲其參數假設什麼名稱。最簡單的解決方案是提供參數名稱明確:

private static String[] parameterNames={ "name", "address" }; 
public void parametersForValidation(String name,String address){ 
    validateParameters(parameterNames, name, address); 
} 
private void validateParameters(String[] name, Object... values){ 
    for(int ix=0; ix<name.length; ix++) { 
     if(values[ix]==null) { 
      throw new NullPointerException(name[ix]+" is mandatory"); 
     } 
    } 
} 

爲了比較,如果您使用的是Java 8 編譯使用-parameters選項代碼,參數名稱可在通過反射運行,也就是說,你可以使用

public void parametersForValidation(String name, String address) { 
    String[] names; 
    try { 
     names = Arrays.stream(getClass() 
      .getMethod("parametersForValidation", String.class, String.class) 
      .getParameters()).map(Parameter::getName).toArray(String[]::new); 
    } 
    catch(ReflectiveOperationException ex) { throw new AssertionError(ex); } 
    validateParameters(names, name, address); 
} 
private void validateParameters(String[] name, Object... values) { 
    for(int ix=0; ix<name.length; ix++) { 
     if(values[ix]==null) { 
      throw new NullPointerException(name[ix]+ " is mandatory"); 
     } 
    } 
} 

這顯然是不不僅僅是提供簡單的名稱和交換名稱的顯式列表的名稱和參數類型的方法的顯式列表來查找反射LY。

0

不可行。

public void parametersForValidation(String name, String address) { 
    Objects.requirNonNull(name, "name is mandatory"); 
    Objects.requirNonNull(address, "address is mandatory"); 
    ... 
} 

您可以使用

public void parametersForValidation(@NonNull String name, @NonNull String address) { 
    ... 
} 

和註釋處理。但是,由於Optional<?>我會簡單地使它成爲一個艱難的約定。並使用代碼風格的檢查。

相關問題