2016-09-26 43 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<?>我会简单地使它成为一个艰难的约定。并使用代码风格的检查。