2016-09-26 10 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"); 
} 
} 

「値は必須」ではなく「名前は名前です」および「アドレスは必須です」というパラメータ名が必要です。 助けてもらえますかアドバンテージありがとう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"); 
     } 
    } 
} 

あなたが-parametersオプションを使用してコードをコンパイルしていたJava 8 使用している場合:最も簡単な解決策は、明示的にパラメータ名を提供することですすなわち、あなたは明らかに名前だけを提供するよりも簡単ではなく、反射をルックアップするメソッドの名前とパラメータの型の明示的なリストに名の明示的なリストを交換

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"); 
     } 
    } 
} 

を使用することができますまあ。

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<?>以来、私はそれを簡単な大会にするのは簡単です。また、コードスタイルチェッカーを使用します。

関連する問題