Javaでnullを避けるための良い軽量設計パターンは何ですか?

明らかに、Javaプログラミングの最大の障害の1つは、ヌルとヌルポインタ例外です。あなたのコードにあまり多くは追加しないが、砂のヌルポインタ例外の問題を減らすために、どのようなデザインパターンがありますか?

11
@MichaelBorgwardtは簡単に診断することができますが、一般的であり、コードに多くの行を追加してしまうことはありません。実際には、おそらく最も多くの追加コードで対処する必要があります。
追加された 著者 Joe,
私は特に書くことを避けたい:if((a!= null)&&(a.getB()!= null)&(a.getB()。getC()!= null)){// stuff}
追加された 著者 Joe,
@thinksteep、あなたがそれをたくさんし、良いパターンが確立できれば、それは有益です。これは、通常処理される方法が冗長である場合に特に当てはまります。
追加された 著者 Joe,
nullpointerチェックのパターンが本当に必要ですか? commonsutilのようなものを使うと十分ではありませんか?
追加された 著者 kosa,
"明らかに最大のベーンの一つ"? NullPointerExceptionsは、最も簡単に診断できる種類の問題の1つです。
追加された 著者 Michael Borgwardt,

9 答え

Null Object pattern. Look at Optional class from google-guava library.

彼らのwikiには、ヌルの使用と回避に関する記事があります。

11
追加された
あなたは既にあなたの意見を他のところで作っています。この解決策を読んだら、ヌルを黙って無視することに役立つものではなく、単にそれらをより良く扱うことに役立ちます。
追加された 著者 Joe,
私はグーグルグアバが優れたおいしさをたくさん持っていることを知っていた。私はそれがこの問題に対処したことを知らなかった。
追加された 著者 Joe,
はい、しかし、異常な状況が発生した場合、なぜプログラムは正常に動作するはずですか?
追加された 著者 UmNyobe,
Null Objectパターンは、砂ヌルポインタ例外の問題をどのように減らすことができますか?
追加された 著者 UmNyobe,
@UmNyobe:nullではなくオブジェクトがある場合は、NullPointerExceptionを取得できません。
追加された 著者 Michael Borgwardt,
@ジョー:私はちょうどラインを傷つけるの世界のために自分自身を設定していないことを望む。エラー状態を黙ってバイパスするアプリケーションは、悲鳴を上げることや蹴ることよりもトラブルシューティングを行うのがずっと難しくなります。
追加された 著者 pap,

The best design pattern of all - the Check Not-Null Idiom

if(obj != null) {
    ...
}
4
追加された
それは大丈夫なパターンですが、それほどデザインビットではありませんか? :)
追加された 著者 George Mauer,
それが私の行いなのです。しかし、私はより良いものを望んでいます。
追加された 著者 Joe,
@Marceloもしあなたがそのような行を使用すれば、OOPやいくつかのデザインパターンを導入してコードをきれいにすることができます。しかし、私はあなたが意味することを理解する
追加された 著者 GroundZero,
私はこのイディオムを使用するコードをたくさん見ていますが、一般的に私は震えさせます。もし "if"に関連する "else"がなければ、私は "未定義の振る舞い"の領域に移っていると思う傾向があります。
追加された 著者 DaveH,
間違いなく最高のパターン。これをチェックする: object.get()。doSomething()。doMore()。stillProcessing()。yep()。‌ gotIt()(:
追加された 著者 Marcelo,
Demeterの@Marceloの法則? :)
追加された 著者 Calimar41,

なぜあなたはnullポインタの例外を避けたいのですか? null を得ることは、コードを書くとき何かが間違っている最初の兆候の1つです。 Null Object Pattern のようなものは、それが適切であると確信できる場合に使用する必要があります。デザインパターンの最大の欠点の1つは、その悪用/誤用です。

編集:

私はヌルリターンを減らす最善の方法は例外の使用を増やすことだと思います。インデックス-1の要素にアクセスしようとすると、ヌルオブジェクトを返すリストを考えると、次のようなものが使用されます

if(list.get(-1).equals(nullObject))

それはさらに悪いことです。引数が予期しないものであっても互換性のないものであっても、例外を発生させる方が良いと思います。

3
追加された
NULLポインタよりも多くのチェック例外が優先されます。彼らは何かが間違っていることを示すので、私はnullポインタが好きではありませんが、彼らは実行時に行います。あなたのコードがエラーを追跡しているので、問題に対する論理的解毒剤を提供することができるため、Null Object Patternのようなものが優れています。
追加された 著者 Joe,

あなたのメソッドでnullオブジェクトを返さないようにしてください。

public MyObject bohemianRhapsody(){

   try {
       if(isThisTheRealLife())
           return new MyObject("is this just fantasy");
       else
           return new MyObject("caught in a landslide, no escape from reality");
   } catch(ExampleCatchableException e){
       return new MyObject("");//instead of return null
   }
}

...
System.out.println(bohemianRhapsody());//will never print null

また、ヌルオブジェクトパターンと呼ばれるものもあります。

3
追加された
@Marcelo - あなたの更新はNull-Objectパターンに近い。 (おそらく)MyObjectは ToString を呼び出すことによってインターフェイスに表示されます。 MyObject(null)を返して ToString()その特殊なケースで空の文字列を返します。そのようにしても、コードを呼び出すと、結果がnullかどうか( IsNull()メソッドを使用して)チェックできますが、null例外は発生しません。 C#の Nullable <> クラスを参考にしてください。
追加された 著者 George Mauer,
これはNull-Objectパターンではありません。空文字列とnullの間に違いがあります。呼び出すコード(あなたはこの公式のafterallを作成しました)は、返されたものがnullか空であるかどうかに基づいて決定することを非常に合理的に望みます。
追加された 著者 George Mauer,
私のコードでは、私はうれしいことに何か例外をスローします。
追加された 著者 UmNyobe,
@GeorgeMauer、それは非常に合理的に直接インターフェイス上で結果を使用することができます - その場合、 "null"または何も表示しない方が良いですか?
追加された 著者 Marcelo,

There are some helpfull annotations designed for thiese purposes by IntellyJ: @Nullable and @NotNull
Detecting probable NPE’s

3
追加された

私はそれが味の問題だと思うが、私はSmalltalk/Objective-Cのような言語の最大の苦境は、彼らがヌルを持っておらず、NullPointerExceptionsがないということです。私は "ヌルオブジェクトパターン"のファンではない、実際には私はそれがトラブルシューティングを行い、実際の利益なしではるかに困難なバグを見つけると、情熱でそれを嫌う。 Null は意味があり(悪いことが多い)、他の一般的な状態と同じように扱うべきではありません。

このスレッドでも言及したように、NPEは本当に強力で、早期に構文エラーや不良コードを捕捉する良い方法です( = null)。アプリケーションが実行時にNPEの生成を開始すると、間違ったことが起きて修正が必要になります。例外を隠そうとしないで、例外を引き起こしているものを修正してください。

2
追加された
しかし、エラーがあることをカプセル化し、設定しなければならないときにチェック例外をスローするnull-objectはどうでしょうか?ヌルネスをチェックすることの問題は、私たちが人間であり、それをすることを忘れることです。 Nullは基本的にJava Objectモデルを破壊します。あなたの手を保持していることを思い出させる言語が必要だと感じない場合は、Javaよりもタイピングが弱い言語で生産性が向上します。
追加された 著者 Joe,
ヌルポインタ例外は未チェックの例外です。問題は、実行時まで問題を知らないことです。あなたのコードは、最初に何かに価値がないということに対処するために書かれています。
追加された 著者 Joe,
もちろん。そういうわけでヌルネスをチェックするのです。私が怖いと思うのは、値がNPEのような明確で適切な反応を引き起こすことなくヌルになることができるときです。 Smalltalk/Obj-cの "nullもまたオブジェクトである"というアイデアは、私は単純にぞっとするだけです。 Nullは値ではなく、nullです。
追加された 著者 pap,
"something definetly not null".equals(maybeNullVar)

maybeNullVar.equals("something definetly not null")
2
追加された

これらのメソッド(Apacheのcommons-langも参照)は、コードの意味的意味を保持するメソッドにそれらをカプセル化することで、String処理の場合のヌルチェックの負担を軽減できます。

public static boolean isBlank(final String str)
{
    return (str == null) || str.isEmpty();
}

public static boolean isNotBlank(final String str)
{
    return !StringUtils.isBlank(str);
}

public static boolean isEqual(final String s1, final String s2)
{
    if (s1 == s2) { return true; }
    if ((s1 == null) || (s2 == null)) { return false; }
    return s1.equals(s2);
}

public static boolean isNotEqual(final String s1, final String s2)
{
    return !StringUtils.isEqual(s1, s2);
}
1
追加された

デザインパターンを使用する必要はありません。

宣言時に変数を初期化するだけです。

例えば

List names = new ArrayList();
Map pairs = new HashMap();
1
追加された