2013-08-05 12 views
5

私はオブジェクトのクエリをAnimalのために言い、返されたオブジェクトがnullではなくnull変数を含んでいる場合は間違っていますか?例えば、私はanimal.getDeathDate()と呼ぶことができます。それはまだ死んでいないので、それはnullを返します。タートルの場合はタートルロケットパックが追加されるまで飛べないのでnullを返します。その他などがあります。null変数を含むJavaオブジェクトはアンチパターンですか?もしそうなら、どちらですか?

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

+1

Nullオブジェクトパターンが必要な場合があります。 – SLaks

+0

ヌルオブジェクトパターンについて読んだけど、ヌル変数を持つオブジェクトを扱っているかどうかはわかりませんでした。私はnullまたはオブジェクトがデータオブジェクトではなくクエリメソッドから返されるべきかどうかに関連すると考えました。 – FooBar

+1

Nullオブジェクトパターンは基本的にすべてのヌルに適用されます。 null以外の値を保証すると、コードがはるかに簡単になります。 – zapl

答えて

4

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

初期化されていないフィールドと無関係なフィールドには、あらかじめ定義された定数を使用する方がよい場合がよくあります。

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

As brought by google-guava docs

ダグ・リー(java.util.concurrentパッケージの作者)がNull s**ksと述べました。

また、sir C. A. R. Hoare、発明者null参照:I call it my billion-dollar mistake

そんなに広い肩があります。生きている動物の死亡日をnullを返す

+0

これは私の意見ですが、参考資料それをサポートするのに役立ちます。 Googleを通じてNull Object Patternの周りでかなり大きな議論をすることはできませんでした。 – FooBar

+0

@FooBarは参考文献を追加しました。 – yair

+0

'getDeathDate()'が返すために何を提案しますか? – Gabe

1

Nullは、オブジェクトが特定のプロパティを持たないことを表す完全に合理的な方法です。

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

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

0

これは私の意見ですが、 "ヌルオブジェクト"のメソッドが何を返すかをヌルチェックする必要があるので、あなたの例はアンチパターン(縮退ヌルオブジェクト)のように聞こえます。これらのゲッタをまったく起動しないと、あなたの例は正しいでしょう。

ヌルオブジェクトのアイデアは、ヌルチェックをまったく実行する必要がないため、ゲッターが他のヌルオブジェクトを返す場合や、メソッドがを使用している場合に働く可能性があります。 (そしてただ空を返す)。

4

は完全に合理的であるが、このようなケースでは、私はそれがより良いブール死のチェックを提供することを見つける:

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

これは死を確認する合理的な方法を提供しています属性の不器用なヌルチェックなしのインスタンスの-ness:

// 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() { 
     // 
    } 
} 
+0

のgetFlyingSpeedの場合は、インターフェイスを実装する代わりに、Animalクラスのインスタンス変数をFlyerタイプにすることができますか(このインターフェイスには飛行速度と飛行速度の2つのメソッドがあります) – Atul

+0

canFly()は必要ありません。a)if(animal instaceof Flyer)を使用することができます。b)フライヤーメソッドにアクセスするには、フライヤーにキャストする必要があります。キャストする前にチェックのインスタンスを実行する必要があるためです。 – Bohemian

0

ヌルは完全に罰金ですが、あなたの代わりに返されるべき例えば 空のリストを可能

限り、デフォルト値を使用してそれらを回避しようとしてください:

代わりに、このようなものを使用ヌルの 列挙データ型の仮定の上にUNKNOWN

が含まれている必要があります

APIの消費者の生活が容易になります

あなたの例で私は任意の適切なデフォルト値を考えることができないので、私はanimal.getDeathDateからnullを返すだろう。

私は便利な方法は、私が

0

ヌルオブジェクトパターンが実際にnullの変数の場合に使用することができますあなたの場合は0を返します)(getFlightSpeedについて真/偽

を返すanimal.isDead提供します。 Turtle.getFlightSpeed()の場合は、SPEEDの概念(インターフェイスクラスまたは抽象クラス)を抽象化し、「飛べない」シナリオを実装するNULLオブジェクトを1つ持つことができます。 これは、Turtleクラスにデフォルトの動作を割り当てるのに役立ちます。 animal.getDeathDate()の場合nullを返すのがきれいだと思われる

1

私は間違っているとは思わない。アナロジーとして、NULL in SQLの意味を考える:

NULLが何を意味するのか覚えて良い方法は 情報の面で、「値の欠如は、」値」と同じものではありませんことを覚えておくことです ゼロ ";同様に、「答えの欠如」は、「 答えがない」と同じではありません。

Javaで同じロジックを適用することは完全に有効です。

プリミティブ型をnull可能にするには、nullable types in C#をチェックしてください。 NullableをJavaジェネリックとして実装するのは簡単です。

0

私は動物のためだと思います。動物が生きている場合はnullを返すgetDeathDate()が正しい方法です。動物の生きている動物と死んだ動物の2つのケースを扱うためには、常に特別なコードが必要です。動物が生きている場合には、あなたが戻ってくる可能性のある日付はありません。

getFlightSpeed()の場合は、状況によって異なる場合があります。返すものは分かりませんが、単にm/sとして速度を返すと想像してみましょう。

この場合、0(または同じ効果のオブジェクト)を返すのは理にかなっています飛行速度を記述します。

+0

"動物が生きていれば、animal.getDeathDate()がnullを返すのは正しいことだと思います。" 動物が死亡した場合はどうなりますか?しかし、いつ誰が知っていますか? –

1

大きなnullチェックルール私は、リストや配列の代わりにnullを置くことはありません。

空のリストと配列は、実際のものを表現する方がはるかに優れています。

関連する問題