2

Javaではnull object、すべての参照でnullチェックを行わずにコードを乱雑にするよりもパターンを優先します。最近、オブジェクトnull objectを保持して使用する際に問題が発生しました。以下のようなクラスがある と仮定しますsingleton
Person

public class Person {
 public String firstName;
 public String lastName;
 public boolean isNull() {
  return false;
 }
 public static final Person NULL = new Person() {
  public boolean isNull() { return true; }  
 }
}

この場合、NULLオブジェクトをfinalとして宣言しましたが、メンバー変数とそのグローバルで使用可能な変数を変更できます。

Person nullRef = Person.NULL;
Person.NULL.firstName = "sample";
System.out.println(nullRef.firstName);

この場合、その3つのフィールドだけで、これらの3つのgetterメソッドをオーバーライドすることで可変性の問題を解決できます。しかし、実際には、対応するすべてのゲッターメソッドをオーバーライドするのが難しい多くのフィールドがあります。
オブジェクトのこの可変性の問題を解決するための標準的なパターンまたは戦略はありNULLますか?

4

3 に答える 3

2

Optional From Google Guava ライブラリを使用する

Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5

ライブラリのドキュメントを引用:

null に名前を付けることによる読みやすさの向上に加えて、Optional の最大の利点は、そのばかばかしさです。

これは null オブジェクトを扱うより自然な方法です

オプションの Google グアバ

于 2012-12-03T12:33:35.667 に答える
1

2 つのレベルのインターフェイスが必要です。1 つは不変部分 (getter と不変メソッドのみ) 用で、もう 1 つは不変インターフェイスを拡張する可変部分用です。次に、関連するすべての場所で可能な限り最も制限の厳しいインターフェイスのみを使用するように、コードをリファクタリングする必要があります。

そう

public interface ImmutablePerson {
  final String getFirstName();
}

public interface MutablePerson extends ImmutablePerson {
  final void setLastName(final String newName);
}

はい、MutablePerson は「ImmutablePerson」ですが、1 つとして使用する場合のみ :)

さらに、isNull チェックは、制御の反転についてもっと考える必要があることを示しています。

具体的には:

次のようなコードを書いていることに気付いたとき

if (!person.isNull()) {
  person.setLastName("Foo");
}

代わりに、Null オブジェクトを使用して、それを中立的な要素として考えてください。そのようです:

初め:

final Person NullPerson = new Person() {
  void setLastName(final String newName) {
    // Do nothing, this is a neutral (Null) object
  }
}

...そしてその後:

// Never need to check for isNull ever again - null objects just decide to ignore your request
person.setLastName("Foo");
于 2012-12-03T10:50:03.050 に答える
0
  • すべてのフィールドを「プライベート」にして、getter コード以外の外部からアクセスできないようにする必要があります。
  • 不変にするためには、ゲッターメソッドではなく、「セッター」メソッドを変更する必要があります。たとえば。

    public String setFirstName(文字列名){ if(!isNull()){ firstName = name; } }

于 2012-12-03T10:45:05.350 に答える