web-dev-qa-db-ja.com

Javaで空のチェックを行うより良い方法はありますか?

これは原始的な質問のように見えるかもしれませんし、これは私が知らない単純なユーティリティライブラリメソッドによって行われるかもしれません。

目標は、2つのオブジェクトの下にネストされているブールフィールドの値をチェックすることです。

_private boolean sourceWebsite(Registration registration) {
    Application application = registration.getApplication();
    if (application == null) {
        return true;
    }

    Metadata metadata = application.getMetadata();
    if (metadata == null) {
        return true;
    }

    Boolean source = metadata.getSource();
    if (source == null) {
        return true;
    }

    return !source;
}
_

これは単一のif()で実行できることを知っています。読みやすくするために、ここに複数のifを追加しました。

上記のifステートメントを簡略化し、親オブジェクトかnullでない場合に_Boolean source_の値を返す単純なユーティリティクラスを作成する方法はありますか?

23
codeMan

Java.util.Optional このように:

private boolean sourceWebsite(Registration registration) {
    return Optional.of(registration)
        .map(Registration::getApplication)
        .map(Application::getMetadata)
        .map(Metadata::getSource)
        .map(source -> !source)
        .orElse(Boolean.TRUE);
}

つまり、いずれかのゲッターがnullを返した場合はtrueを返し、!Metadata.source さもないと。

38
ernest_k

次のいずれかがnullの場合、trueを返します。すべての値がnullでない場合、!sourceを返します。

private boolean sourceWebsite(Registration registration) {
      return registration.getApplication() == null 
      ||     registration.getApplication().getMetadata() == null
      ||     registration.getApplication().getMetadata().getSource() == null
      ||    !registration.getApplication().getMetadata().getSource();

}

更新:

すべてのゲッターが2回以上呼び出されないようにしたい場合は、次のようにすべてのオブジェクトの変数を宣言できます。

private boolean sourceWebsite(Registration registration) {
      Application application;
      Metadata metadata;
      Boolean source;
      return (application = registration.getApplication()) == null 
      ||     (metadata = application.getMetadata()) == null
      ||     (source = metadata.getSource()) == null
      ||    !source;

 }
15
Khalid Shah

使用できる別のオプションは、try-catchブロックです。 nullポインタ例外が発生した場合はtrueを返します。

private boolean sourceWebsite(Registration registration) {
    try {
        return !registration.getApplication().getMetadata().getSource();
    }
    catch (NullPointerException e) {
        return true;
    }
}
2
CaptianObvious