2

次の Bean があるとします。

@Entity
public class Currency {

    private String currency;

    public String getCurrency() {
        return currency;
    }

    public void setCurrency(String currency) {
        this.currency = currency;
    }
}

@Entity
public class SomeEntity  {
    private Currency currency;

    public Currency getCurrency() {
        return currency;
    }

    public void setCurrency(Currency currency) {
        this.currency = currency;
    }
}

私は SomeEntity のインスタンスを持っています:

SomeEntity entity;

コードのどこかでエンティティのプロパティを使用したいのですが、エンティティが である可能性がnullあり、エンティティのプロパティの一部が である可能性がnullあるため、現在のコードの実装は読みやすいものではありません。

new ConstantExpression(entity == null ? null : entity.getCurrency() != null ? entity.getCurrency().getId() : null)

この場合のコードの読みやすさを改善する方法はありますか?

更新:私のコードベースは十分に大きいので、Null オブジェクト パターンの実装には多くの変更が必要です。さらに、私の Bean は JPA を使用して db に永続化されるため、Cascade アノテーションなどの追加のコーディングを行う必要があります。

4

4 に答える 4

1

Null Object Patternを使用できます。

  • getId()常に返す通貨のサブクラスを作成しますnull
  • すべてのcurrencyフィールドを初期化するために使用するこのクラスの単一のインスタンスを用意します。
  • getCurrency().getId() は安全です。
  • 必要に応じて、同じことを繰り返しますSomeEntity
于 2012-10-11T08:11:11.710 に答える
1

言語の設計方法により、null チェックを完全になくすことはできません。しかし、彼らがここであまりにも迷惑になったとき、私はやりたいことの1つです.

null チェックを行う「utils」クラスを作成します。commons-lang でStringUtilsを見つけたとき、それはとても「あはは」の瞬間でした。等しいかどうかを比較する必要がある 2 つの文字列があるとします。

String a;
String b;
// code goes here. a and/or b may or may not be initialized

if (a.equals(b))
{
    // do something
}

ご承知のとおり、上記のコードには NullPointerException が発生するリスクがあります。したがって、代わりに次のように書く必要があります。

if (a != null && a.equals(b))
{
    // do something
}

StringUtils を入力します。代わりに、

if (StringUtils.equals(a,b))
{
    // do something
}

それが冗長すぎる場合、またはこのコードで多数の equals を実行している場合は、静的インポートを使用できます。

import static org.apache.commons.lang.StringUtils.*;
//...

if (equals(a,b))
{
    // do something
}

出来上がり - インスタントの簡潔なコード。この魔法はどのように達成されますか?静的メソッドに null チェックを入れるだけです。StringUtils の実装は次のとおりです。

public static boolean equals(CharSequence cs1, CharSequence cs2) {
    if (cs1 == cs2) {
        return true;
    }
    if (cs1 == null || cs2 == null) {
        return false;
    }
    if (cs1 instanceof String && cs2 instanceof String) {
        return cs1.equals(cs2);
    }
    return CharSequenceUtils.regionMatches(cs1, false, 0, cs2, 0, Math.max(cs1.length(), cs2.length()));
}

あなたの場合、次のような utils クラスを作成することを検討してください。

public class MyUtils
{
   public static String getCurrencyId(Currency currency)
   {
      if (currency == null)
         return null;
      return currency.getId();
   }

   public static String getCurrencyId(SomeEntity entity)
   {
      if (entity == null)
         return null;
      return getCurrencyId(entity.getCurrency())
   }
}

今すぐ呼び出しコードで

import static mypackage.MyUtils.*;

new ConstantExpression(getCurrencyId(entity));

はい - このようなクラスを使用することは妥協です。そもそもクラスを作成しなければならないのは煩わしく、努力する価値があるかどうかを判断できるのはあなただけです。ただし、呼び出しコードが非常に複雑で、null チェックによってロジックに従うのが本当に困難な場合は、null チェックを非表示にするためだけに別の utils クラスを用意することで、長期的には労力が軽減される可能性があります。

于 2012-10-11T15:07:55.777 に答える
0

エンティティを取り、便利なアクセス メソッドを提供するだけのデコレータを実装できます。

于 2012-10-11T08:04:31.370 に答える
0

私はそれらを使用するのが好きではありませんが、「Null」値とオブジェクトでいっぱいの「Null」オブジェクトを使用する代わりに使用する人もいnullます。

于 2012-10-11T08:06:48.107 に答える