1

私は他の開発者によって開発されたプロジェクトに取り組んできました。このプロジェクトでは、エンティティまたはオブジェクトを返すメソッドは、と呼ばれる特別な値を返すように設計されていますEMPTY_VALUE

public Customer getCustomer() {
    if (everythingFine) {
        return realCustomer();
    } else {
        Customer.EMPTY_VALUE;
    }
}

そしてCustomerクラス:

public class Customer {
    public static final Customer EMPTY_VALUE = new Customer();

    private String firstName;
    private STring lastName;

    public Customer() {
        this.firstName = "";
        this.lastName = "";
    }
}

getCustomer()メソッドを使用する他の場所:

Customer customer = getCustomer();
if (customer != Customer.EMPTY_VALUE) {
    doSomething(customer);
}

上記の方法には、チェックよりも利点がありnullますか?それは私たちに何かを買うのですか?

Customer customer = getCustomer();
if (customer != null) {
    doSomething(customer);
}
4

3 に答える 3

4

これは、Nullオブジェクトパターンの例です。利点は、デフォルトの動作を行うオブジェクトを使用する代わりに、明示的なnullチェックを削除できることです。この場合、nullオブジェクトは、フィールドが照会されたときに空の文字列を返すため、結果が得られない場合にそれが必要な場合は、nullのチェックを保存するだけです。明らかに、すべてのデザインパターンと同様に、その有用性は特定の状況によって異なります。

于 2012-07-01T01:28:55.100 に答える
4

どちらとも言えません。nullメソッドから特別な「エラーオブジェクト」を返さない、または返さないでください。代わりに例外をスローさせます。そうすれば、電話をかけるたびに「チェック」する必要がなくなります。

public Customer getCustomer() {

    if (everythingFine) {
        return realCustomer();

    throw new NoCustomerException();
}

そして、このメソッドを使用するコードははるかに単純になります。

doSomething(getCustomer());

(上記の例のように)実行時例外またはチェック済み例外である可能性があります。


2つから選択する必要がある場合は、メソッドからの代わりに空のリストを返すことを選択するのと同じように、null以外のバリアントを選択しますnull。ただし、その特別なオブジェクトを処理するための特別なコードを記述しないことをお勧めします。他の顧客と同じように処理する必要があります。

于 2012-07-01T01:29:45.047 に答える
4

ダミーの空の Customer オブジェクトを作成するという考えは好きではありません。それのセマンティクスは何ですか?それは本当の顧客ですか?

この状況ではOptional from Guava のようなものを使用するかnull、クライアントコードに応じて使用することをお勧めします。リンクの説明を読んで、一般的な使用方法と Optional の API を確認してください。

于 2012-07-01T01:36:11.260 に答える