我々は、Javaのすべてのオブジェクトの作成を主張するべきでしょうか?

StackOverflow https://stackoverflow.com/questions/1103422

  •  12-09-2019
  •  | 
  •  

質問

明白な答えで愚かな質問のように聞こえる:)

それでも私は二重に必ずお願いしてきましたあえてます。

私たちが実際に使用している

下記のように主張します
ArrayList alProperties = new ArrayList();

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

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

事前に感謝します。

役に立ちましたか?

解決

を使用するには何のまともな理由は、そのように主張するありません。オブジェクトが何らかの理由で作成されません場合は(例外は、例えば、投げたりVMが終了したため)、あなたのアサートにも達しません。

他のヒント

Sunの<のhref =「http://java.sun.com/j2se/1.4.2/docs/guide/lang/assert.html」のrel = "nofollowをnoreferrerでアサーションを使用した上でいくつかのかなり簡潔なガイドラインがあります。アサーションを持つ「>プログラミング。その記事では、内部の不変条件、制御フローの不変条件、および前提条件、事後条件、およびクラスの不変条件のようなもののために使用されるべきであることを主張する助言ます。

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

オブジェクトの作成に失敗した場合は、

、JVMは、OutOfMemoryErrorがスローされますが、それはあなたがとにかく修復不可能screwdされそうだ発生した場合。

それは、JVMを信頼していないようなものです。与えられたとして、あなたが取る何に関して、あなたはどこかで線を引くようになった...

このだけクラッタあなたのコードを主張し、それがこのアサートと等価になります:

boolean a = true;
assert a : "A should be true"
それはあなたのプログラム(たとえば、それはあなたが作っているJVMのためのテストスイートです)の時点でない限り、

あなたは、あなたのJVMをテストするべきではありません。代わりに、あなたはあなたの前提条件、事後条件、不変条件をテストする必要があります。時には、これらのテストは、あまりにも基本的なまたはあまりにも高価です。

前の条件は、おそらく唯一の(あなたが非常に長いメソッドを持っている場合、あなたは彼らがすべてのプライベートであっても、小さな部分にその方法を破る必要があります)メソッドの開始時に表示される必要があります。

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

これは末尾再帰で物事を書くことについての素晴らしいものの一つですが、 -

不変でも頻繁にテストすることができない、あなたはあなたの現在のソリューションは正しい部分的解決策は、(下記参照)であることをテストすることはできません。代わりに、あなたがコメントで不変を宣言します。

あなたは、外部のものを呼び出している場合は、

、あなたも、あなたが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;
}

Javaでは、新しいリターンへの各呼び出し非ヌル新しいオブジェクトへの参照または例外またはエラーが発生しますのいずれか。あなたは次の一致キャッチブロックで終わるので、あなたのアサートが真である最初のケースでは、後者の場合にはアサートが、到達できません。

このアサートテストは、あなたのJava-実装が壊れていると、この場合、あなたもアサートに頼ることができない場合。だから私はそのようなものが主張することはないだろう。 (あなたのメソッドはnullですが、あってはならないパラメータが渡された場合、たとえば)言語によって強制されていないオブジェクト、上の制約のために主張する使用します。

私は完全にあなたの質問を理解してのかわからないが、私はその種類のアサーションがneccesaryないと思います。

プログラムの流れが継続する場合は、インスタンスを作成すると、インスタンスがnull参照ではありません。

あなたが望むには、あなたのプログラムの性質や不変条件をチェックするために主張しています。これを教えるための良い文書では、体系的/系統的な方法で、このような性質を考えるために、プログラマを奨励すべきである。

アサートに失敗した場合は、私を信じて、あなただけのアサートを扱うよりも大きな問題を抱えているとしている。

主張するが失敗した場合は、

私はコンピュータがそれがはずの方法を動作していないとそれが起こるとき、すべての地獄が緩んで破るしようとしているので、それは私が別の仕事を探す時間だと思います!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top