7

動物などのオブジェクトをクエリし、返されたオブジェクトが null ではなく null 変数を含む場合、それは間違っていますか? たとえばanimal.getDeathDate()、 ;を呼び出すことができます。まだ死んでいないため、null を返します。TurtlegetFlightSpeed()は、Turtle ロケット パックが追加されるまで飛行できないため、null を返します。などなど

オブジェクトのメソッドを呼び出して null 以外の値が含まれていることを確認する際に、多くの null チェックが必要になることが多いため、これは悪い方法だと思いました。私自身と同僚の両方にさらに情報を提供できる、これに関する情報へのリンクはありますか?

4

9 に答える 9

5

null曖昧なことが多いです。フィールドはまだ初期化されていませんでしたか、それとも単に値がありませんか?

初期化されていない/無関係なフィールドに対して、定義済みの定数をいくつか用意しておく方がよい場合がよくあります。

さらに良いのは、1 つのクラスに 1 つの責任のみを持たせることです。のようなメソッドgetFlightSpeed()は継承されるべきではなく、インターフェイスの実装から取得されます (ただし、 のようなメソッドは、がまだ生きているgetDeathDate()ときに返される定義済みの定数を持つ必要があります)。Animal

google-guava docs によってもたらされたように

Doug Lea (java.util.concurrentパッケージの作成者) は次のように述べていNull s**ksます。

また、参考文献の発明者であるCAR Hoare氏は次のように述べています。nullI call it my billion-dollar mistake

それは、横たわる広い肩です。

于 2013-08-05T14:09:02.457 に答える
4

null生きている動物の死亡日に戻ることは完全に合理的ですが、このような場合、ブール値の死亡チェックを提供する方が良いと思います:

public boolean isDead() {
    return deathDate != null;
}

これにより、属性の不器用な null チェックを行わずに、インスタンスの死をチェックする合理的な方法が提供されます。

// this is ugly and exposes the choice of the value of the field when alive
if (animal.getDeathDate() != null) {
    // the animal is dead
}

メソッドが整っていれば、これisDead()を行う権利があります。

public Date getDeathDate() {
    if (deathDate == null)
        throw new IllegalStateException("Death has not occurred");
    return deathDate;
}

カメの飛行速度に関しては、同じアプローチを適用できますが、クラスの設計に問題があると私は主張します.すべての動物が飛ぶわけではないので、AnimalクラスにはメソッドがありませんgetFlyingSpeed().

代わりに、次のようなものを使用します。

interface Flyer {
    Integer getFlightSpeed();
}

class Animal {}

class Turtle extends Animal {}

class Eagle extends Animal implements Flyer {
    public Integer getFlightSpeed() {
         //
    }
}
于 2013-08-05T14:10:29.640 に答える
1

私が持っている主要な null チェック ルールは、リストまたは配列の代わりに null を配置しないことです。

空のリストと配列は、それらが実際に何であるかを表現するのにはるかに適しています。

于 2013-08-05T14:20:40.670 に答える
1

Null は、オブジェクトが特定のプロパティを欠いていることを表す完全に合理的な方法である場合があります。

ただし、単一のチェックを許可すると便利です。

配列またはリストの場合、常に null ではなく、空のリストを指すことができる変数を使用する方がよい場合がよくあります。それ以外の場合は、変数が null でないことと、リストにメンバーがあることの両方を確認する必要があります。

于 2013-08-05T14:02:56.897 に答える
0

Null Object パターンは実際に null 変数の場合に使用できます。Turtle.getFlightSpeed() の場合、SPEED の概念 (インターフェースまたは抽象クラスの可能性があります) を抽象化して、「飛行できない」シナリオを実装する 1 つの NULL オブジェクトを持つことができます。これは、Turtle クラスにデフォルトの動作を割り当てるのに役立ちます。animal.getDeathDate() の場合に null を返すことは問題ないようです

于 2013-08-05T14:13:22.803 に答える
0

これは単なる私の意見ですが、「nullオブジェクト」のメソッドが返すものについてnullチェックを行う必要があるため、あなたの例は(縮退したnullオブジェクトとして)アンチパターンのように聞こえます。これらのゲッターをまったく呼び出さない場合、あなたの例は正しいでしょう。

null オブジェクトのアイデアは、null チェックをまったく実行する必要がないということです。そのため、ゲッターが他の null オブジェクトを返す場合、またはメソッドがTell-don't-askアプローチを使用する (そして単に void を返す)場合に機能する可能性があります。 .

于 2013-08-05T14:03:17.760 に答える
0

動物が生きている場合、animal.getDeathDate() が null を返すのは正しい方法だと思います。動物が生きている場合と動物が死んでいる場合の 2 つのケースを処理するには、常に特別なコードが必要です。また、動物が生きている場合に返すことができる有用な日付はありません。

getFlightSpeed() の場合、状況が異なる場合があります。何を返すのか正確にはわかりませんが、例として、速度を m/s として返すと想像してみましょう。

その場合、0 (または同じ効果を持つオブジェクト) を返すことは完全に理にかなっています。なぜなら、それは飛行速度を表すからです。

于 2013-08-05T14:15:08.890 に答える
0

Null はまったく問題ありませんが、できるだけデフォルト値を使用しないようにしてください。

たとえば、null の代わりに空のリストを返す必要があります enum データ型には UNKNOWN を含める必要があります

上記の仮定により、API コンシューマーの生活が容易になります

あなたの例では、適切なデフォルト値が考えられないため、animal.getDeathDate から null を返します。

true/false を返す便利なメソッド animal.isDead を提供します

getFlightSpeed() の場合、あなたの場合は 0 を返します

于 2013-08-05T14:10:52.293 に答える