2009-07-09 10 views
3

明白な答えで愚かな質問のように聞こえます。私たちはすべてのオブジェクトの作成をJavaで行うべきですか?

まだ私は二重確信を尋ねることを約束しました。私たちが実際に使用している

ArrayList alProperties = new ArrayList(); 

assert alProperties != null : "alProperties is null"; 

問題が主張する上で、フォローする小さな&簡単な文書を作成することは困難であるということである下記のように主張します。アサーションに関する書籍はたくさんありますが、理想的には、新しいプログラマーにアサルトのようなものを使用するための非常に簡単なガイドラインを与えたいと思っています。 Btw、pmdのようないくつかのツールは、アサーションの適切な使用をチェックしますか?

ありがとうございます。

答えて

19

このようなアサーションを使用する理由はまったくありません。オブジェクトが何らかの理由で作成されない場合でも、アサートには到達しません(例外がスローされたか、VMが終了したなど)。

+0

'new'と 'assert'の間に多くのコードがあり、 'alProperties'が変更されていない限り、 –

+0

確かに。この例ではコード間にコードはありません。たとえあったとしても、私はアサーションが行く方法ではないと思います。 – Jorn

1

私はあなたの質問を完全に理解することはできませんが、その種の主張は必要ではないと思います。

インスタンスを作成するときに、プログラムフローが続行される場合、インスタンスはnull参照ではありません。

0

ASSERTでプログラムのプロパティまたは不変条件をチェックする必要があります。これを教える良い文書は、プログラマーがそのような特性を系統的/方法論的な方法で考えるように促すはずです。

3

これは、JVMを信頼していないようです。与えられたものとして取るものについては、どこかに線を引く必要があります。

+0

...あなた自身を信頼していません。開発時には、間違いをしたときに教えてくれるテストが必要です。それでは、実行時に、あなたのコードに自信を持っていなければなりません。 –

6

アサーションの使用に関するかなり簡潔なガイドラインが、SunのProgramming with Assertionsにあります。この記事では、内部不変量、制御フロー不変量、前提条件、事後条件、クラス不変条件などのアサーションを使用すべきであるとアドバイスしています。

4

いいえ、オブジェクトの作成を確認する必要はありません。

オブジェクトの作成に失敗した場合、jvmはOutOfMemoryErrorをスローします。その場合は、とにかく修復を超えてネジがかかる可能性があります。

0

アサートが失敗した場合は、私を信じて、アサルトを処理するよりも大きな問題が発生します。

アサートが失敗すると、コンピュータが動作していないために、別の仕事が必要になると思います。すべての地獄が起こったときに、緩んでしまいます。

3

Javaでは、newを呼び出すたびに、新しいオブジェクトへのnull以外の参照が返されるか、ExceptionまたはErrorが返されます。最初のケースではアサートが真ですが、2番目のケースではアサーションには到達しません。なぜなら、次の一致するキャッチブロックで終わるからです。

これは、Java実装が壊れているかどうかをテストします。この場合、アサートに依存することさえできません。だから私はそのような主張をしません。言語によって強制されないオブジェクトの制限については、assertを使用してください(たとえば、メソッドにnullが渡されるべきではないはずのパラメータが渡される場合など)。

3

このアサートだけクラッタあなたのコードは、このアサートに相当します:それはあなたのプログラムのポイントでない限り

boolean a = true; 
assert a : "A should be true" 

あなたは(たとえば、それがためにテストスイートです、あなたのJVMをテストするべきではありませんあなたが作っているJVM)。代わりに、事前条件、事後条件、不変条件をテストする必要があります。時々、これらのテストはあまりにも基本的すぎるか、または高すぎます。

前提条件は、メソッドの開始時にのみ表示する必要があります(メソッドが非常に長い場合は、それらがすべて非公開であっても小さなメソッドに分割する必要があります)。

ポスト条件では、呼び出し元に戻ったものを明確にする必要がありますが、sqrt関数がsqrtを戻したことをテストしていませんが、期待していたことを明確にすることができますおそらく後のコードは複素数を使用し、あなたのためにはテストされていません)。代わりに、下にコメントを残してください。

不変量はしばしばテストできないため、現在の解が正しい部分解(以下を参照)であることをテストすることはできません。これは、テール再帰を使って物事を書くことについての素晴らしい点の1つです。代わりに、不変式をコメントで宣言します。

ArrayList.Create()があった場合は、例のようにアサーションを使用し、nullのアサーションチェックを選択することもできます。しかし、あなたが他のコードを信用していないからです。あなたがそのコードを書いていれば、アサーション(コメントなど)をファクトリメソッド自体に入れることができます。

int max(int[] a, int n) { 
    assert n <= a.length : "N should not exceed the bounds of the array" 
    assert n > 0 : "N should be at least one" 

    // invariant: m is the maximum of a[0..i] 
    int m = a[0]; 
    for(int i = 1; i < n; n++) { 
    if(m < a[i]) 
     m = a[i]; 
    } 

    // if these were not basic types, we might assert that we found 
    // something sensible here, such as m != null 
    return m; 
} 
関連する問題