1

null オブジェクトをテストするための一般的な最適化コードを提供してくれる人はいますか? 私が基本的に探しているのは、任意のオブジェクトを入力として取り、おそらくパスを取り、ターゲットオブジェクトがnullかどうかを指定するブール値を返すことができるメソッドです。

このようなもの:

public boolean isNull(Object Obj, String Path){
    // ... 
}

パスは次のようになります: A.getB().getC(). . .

したがって、 A はオブジェクトとして渡され、isNullメソッドは最初に呼び出しgetB()て、返されたオブジェクトがそうでないかどうかを確認し、null次に呼び出しますgetC()

4

3 に答える 3

3

nullチェックを回避するために使用できるテクニックをハイライトするコメントがたくさんあります。

一般的にチェックを行うために何かを書く必要がある場合は、 s をnull使用してチェック対象のグラフをたどる小さなオブジェクト グラフを作成できます。たとえば、次のようになります。Function

public class NullCheck<T>
{
  private T root;

  public NullCheck(T root)
  {
    this.root = root;
  }

  public <C> NullCheck<C> with(Function<T, C> getter)
  {
    return root != null ? new NullCheck<>(getter.apply(root)) : new NullCheck<>(null);
  }

  public boolean isNull()
  {
    return root == null;
  }

  public boolean isNotNull()
  {
    return root != null;
  }
}

属性 をPerson持つを指定すると、 を使用して次のようなコードを記述できます。AddresszipCodeNullCheck

if (new NullCheck<>(person).with(Person::getAddress).with(Address::getZipCode).isNotNull())
{
  ...
}
于 2015-11-25T17:26:10.780 に答える
2

nullオブジェクトをテストするために利用できる戦略がいくつかあります。

Guava ライブラリを使用して、参照がnullであるかどうか、または前提条件APIを使用していないかどうかを確認できます。

非nullチェックのドキュメントを確認してください: http://google.github.io/guava/releases/snapshot/api/docs/com/google/common/base/Preconditions.html#checkNotNull(T)

nullを回避する方法を説明する Guava Github ページに興味深い記事があります。

Java 8 を使用している場合は、Optional型を使用して、常にnull参照のテストを回避できます。

于 2015-11-25T17:08:30.907 に答える
0

オブジェクトを準備するときに、 @NotNull 注釈をパラメーターに追加できるため、それを取得するときに null 以外のものになります (Java EE 6 以降を使用している場合)。このアプローチは、取得しているオブジェクトで何かを行うのに非常に高速です... null を入力として渡すと、例外が発生します。例外を処理するには、単なる null チェックよりもはるかに多くのリソースと時間がかかります。

上記のものを使用せずに独自のアプローチを作成する場合は、次のようなものを使用できます (例外が必要ない場合は、これを省略できます)。

private static final String NE_MESSAGE = "Object is null...";
private static final String NULL_LOG = "Value is null, param name: ";

public static boolean isNull(Strin name, Object... object) {
  for(Object o : object) {
      if ( o == null) {
          NullException ne = new NullException(NULL_MESSAGE);
          LOGGER.error(NULL_LOG + name);
          throw ne;
       }
     }
   return Boolean.FALSE;
}
于 2015-11-25T17:09:56.943 に答える