36

DataflowAnomalyAnalysis:「DD」が見つかりました-変数「変数」の異常(行「n1」-「n2」)。

DataflowAnomalyAnalysis:「DU」が見つかりました-変数「変数」の異常(行「n1」-「n2」)。

DDとDUはおなじみのように聞こえます...最も弱い前後の条件に関連するテストや分析などで言いたいのですが、詳細は覚えていません。

NullAssignment:オブジェクトをnullに割り当てることは、コードの臭いです。リファクタリングを検討してください。

nullオブジェクトがローカルオブジェクト(メソッドの外部で使用されていない)である場合、ガベージコレクションを支援するオブジェクトを設定しませんか?それともそれは神話ですか?

MethodArgumentCouldBeFinal:パラメータ'param'が割り当てられておらず、finalとして宣言できます

LocalVariableCouldBeFinal:ローカル変数'variable'をfinalと宣言できます

finalパラメータと変数を使用することに利点はありますか?

LooseCoupling:「LinkedList」のような実装タイプの使用は避けてください。代わりにインターフェースを使用してください

特に必要なことがわかっている場合LinkedList、将来の開発者に自分の意図を明確にするためにそれを使用しないのはなぜですか?意味のあるクラスパスの最上位にあるクラスを返すことは1つのことですが、変数が最も厳密な意味であると宣言しないのはなぜですか?

PreventSynchronizedAtMethodLevel:メソッドレベルの同期ではなくブロックレベルを使用する

ブロックレベルの同期には、メソッドレベルの同期に比べてどのような利点がありますか?

PreventUsingShortType:短いタイプは使用しないでください

私の最初の言語はCとC++でしたが、Javaの世界では、データを最もよく表すタイプを使用しないのはなぜですか?

4

6 に答える 6

35
  • DDとDUの異常(私が正しく覚えている場合-FindBugsを使用し、メッセージが少し異なります)は、通常、読み取られる前に別の値が再割り当てされるため、読み取られないローカル変数に値を割り当てることを指します。典型的なケースnullは、宣言されたときに変数を初期化することです。必要になるまで変数を宣言しないでください。

  • nullガベージコレクターを「支援」するためにローカル変数に割り当てることは神話です。PMDは、これが単なる逆効果の混乱であることを通知しています。

  • ローカル変数にfinalを指定することは、オプティマイザーにとって非常に役立つはずですが、このヒントを利用した現在のJITの具体的な例はありません。私はそれが自分のコードの正しさについて推論するのに役立つことを発見しました。

  • …という観点からインターフェースを指定することは、インターフェースは優れた設計手法です。呼び出し元にまったく影響を与えることなく、コレクションの実装を簡単に変更できます。それがインターフェースのすべてです。

  • 一部のインターフェースで宣言されていないAPIを公開していないため、呼び出し元がを必要とする多くのケースを考えることはできません。LinkedListクライアントがそのAPIに依存している場合は、正しいインターフェースを介して利用できます。

  • ブロックレベルの同期により、クリティカルセクションを小さくすることができ、可能な限り多くの作業を同時に実行できます。おそらくもっと重要なのは、それが囲んでいるオブジェクトによって私的に制御されているロックオブジェクトの使用を可能にすることです。このようにして、デッドロックが発生しないことを保証できます。インスタンス自体をロックとして使用すると、誰でもインスタンスを誤って同期し、デッドロックを引き起こす可能性があります。

  • タイプのオペランドは、すべての演算でshortに昇格さintれます。このルールは、このプロモーションが行われていることを通知するものであり、を使用することをお勧めしますint。ただし、このshort型を使用するとメモリを節約できるため、インスタンスメンバーの場合は、おそらくそのルールを無視します。

于 2009-10-23T19:34:43.213 に答える
3

DataflowAnomalyAnalysis:「DD」が見つかりました-変数「変数」の異常(行「n1」-「n2」)。

DataflowAnomalyAnalysis:「DU」が見つかりました-変数「変数」の異常(行「n1」-「n2」)。

わからない。

NullAssignment:オブジェクトをnullに割り当てることは、コードの臭いです。リファクタリングを検討してください。

nullオブジェクトがローカルオブジェクト(メソッドの外部で使用されていない)である場合、ガベージコレクションを支援するオブジェクトを設定しませんか?それともそれは神話ですか?

ローカルメソッド内のオブジェクトは、メソッドが戻るとガベージコレクションされるようにマークされます。それらをnullに設定しても、違いはありません。

経験の浅い開発者になるので、それに関するすべてのnull割り当ては、コードの臭いと見なされる可能性があります。

MethodArgumentCouldBeFinal:パラメータ'param'が割り当てられておらず、finalとして宣言できます

LocalVariableCouldBeFinal:ローカル変数'variable'をfinalと宣言できます

finalパラメータと変数を使用することに利点はありますか?

オブジェクトのライフサイクル中に値が変更されないことが明確になります。

また、万が一誰かが値を割り当てようとした場合、コンパイラはコンパイルタイプでのこのコーディングエラーを防ぎます。

このことを考慮:

 public void businessRule( SomeImportantArgument important )  {
      if( important.xyz() ){
          doXyz();
      }
      // some fuzzy logic here
      important = new NotSoImportant();
      // add for/if's/while etc 

     if( important.abc() ){ // <-- bug
         burnTheHouse();
     }
  } 

時々家を燃やす不思議なバグを解決するためにあなたが割り当てられているとしましょう。

使用されたパラメーターが何であったかを知っていますが、条件が満たされない場合にメソッドが呼び出される理由がわかりません(調査結果によると)burnTHeHouse

途中のある時点で、誰かが参照を変更していること、および他のオブジェクトを使用していることを確認するには、しばらく時間かかります

finalこの種のことを防ぐためにヘルプを使用する。

LooseCoupling:「LinkedList」のような実装タイプの使用は避けてください。代わりにインターフェースを使用してください

特に必要なことがわかっている場合LinkedList、将来の開発者に意図を明確にするためにそれを使用しないのはなぜですか?意味のあるクラスパスの最上位にあるクラスを返すことは1つのことですが、変数が最も厳密な意味であると宣言しないのはなぜですか?

この場合、違いはありません。あなたは特定の機能を使用していないのでLinkedList、提案は公正だと思います。

今日、LinkedListは理にかなっていますが、インターフェースを使用することで、自分自身(または他の人)が気に入らないときに簡単に変更できるようになります。

小規模で個人的なプロジェクトの場合、これはまったく意味がないかもしれませんが、すでにアナライザーを使用しているので、コードの品質はすでに気になっていると思います。

また、経験の浅い開発者が良い習慣を身に付けるのに役立ちます。[あなたが1人だと言っているわけではありませんが、アナライザーはあなたを知りません;)]

PreventSynchronizedAtMethodLevel:メソッドレベルの同期ではなくブロックレベルを使用する

ブロックレベルの同期には、メソッドレベルの同期に比べてどのような利点がありますか?

同期セクションは小さいほど良いです。それでおしまい。

また、メソッドレベルで同期すると、オブジェクト全体がブロックされます。ブロックレベルで同期する場合は、その特定のセクションを同期するだけです。状況によっては、それが必要な場合もあります。

PreventUsingShortType:短いタイプは使用しないでください

私の最初の言語はCとC++でしたが、Javaの世界では、データを最もよく表すタイプを使用しないのはなぜですか?

私はこれを聞いたことがありません、そして私はあなたに同意します:)しかし私は短いものを使ったことがありません。

int私の推測では、それを使用しないことで、シームレスにアップグレードするのに役立つでしょう 。

コードの臭いは、パフォーマンスの最適化よりもコードの品質を重視しています。そのため、プログラムの速度を向上させるよりも、経験の浅いプログラマーや落とし穴を避けるためのアドバイスが提供されます。

このようにして、より良い設計に合うようにコードを変更しようとするときに、多くの時間とフラストレーションを節約できます。

アドバイスが意味をなさない場合は、無視してください。あなたが担当の開発者であり、ツールはまさにそのツールです。何かがうまくいかない場合、ツールのせいにすることはできませんよね?

于 2009-10-23T19:40:02.500 に答える
3

final質問についてのメモ。

変数に「final」を設定すると、割り当て可能になるのは1回だけになります。これは必ずしも書きやすいという意味ではありませんが、将来のメンテナにとって読みやすいという意味です。

これらの点を考慮してください:

  • aが付いている変数は、finalすぐに「視聴中に値が変更されない」に分類できます。
  • 含意によって、変更されないすべての変数がfinalでマークされている場合、finalでマークされていない変数は実際に変更されることを意味します。

これは、定義部分を読むときに、コード中に値が変わる可能性があるため、注意すべき変数をすでに確認できることを意味します。また、コードが読みやすくなるため、メンテナはより適切に作業を行うことができます。

于 2010-12-15T13:32:11.130 に答える
1

オブジェクトがローカルオブジェクト(メソッドの外部で使用されていない)である場合、オブジェクトをnullに設定すると、ガベージコレクションに役立ちませんか?それともそれは神話ですか?

それが行う唯一のことは、メソッドの終了前にオブジェクトをGCdできるようにすることです。これは、めったに必要になることはありません。

最終的なパラメータと変数を使用することに利点はありますか?

コードを分析するときにどこかで値が変更されることを心配する必要がないため、コードがいくらか明確になります。多くの場合、変数の値を設定した後は、変数の値を変更する必要がないか、変更したくない場合があります。

LinkedListが特に必要であることがわかっている場合、将来の開発者に意図を明確にするためにLinkedListを使用しないのはなぜですか?

LinkedListが特に必要になる理由を考えてみてください。

意味のあるクラスパスの最上位にあるクラスを返すことは1つのことですが、変数が最も厳密な意味であると宣言しないのはなぜですか?

ローカル変数やフィールドについてはあまり気にしませんが、タイプのメソッドパラメータを宣言すると、やLinkedListのようなものを使用できなくなるため、あなたを追い詰めて傷つけます。Arrays.asList()Collections.emptyList()

ブロックレベルの同期には、メソッドレベルの同期に比べてどのような利点がありますか?

最大の利点は、専用のモニターオブジェクトを使用できるため、すべてが同じモニターを使用するのではなく、必要なクリティカルセクションのみが相互に排他的であるということです。

Javaの世界では、データを最もよく表すタイプを使用しないのはなぜですか?

intより小さい型は、すべての計算で自動的にintにプロモートされ、それらに何かを割り当てるにはキャストダウンする必要があるためです。これにより、コードが乱雑になり、かなりの混乱が生じます(特にオートボクシングが関係している場合)。

于 2009-10-23T20:13:03.353 に答える
0

ブロックレベルの同期には、メソッドレベルの同期に比べてどのような利点がありますか?synchronize(getClass())メソッドの同期は、ブロックを実行するようなものであり、すべてのクラスをブロックします。

多分あなたはそれを望まない

于 2010-03-18T18:45:42.353 に答える
0

PreventUsingShortType:短いタイプは使用しないでください

  • リストアイテム

    ショートは16ビット、Javaでは2の褒め言葉

  • 別のshort以外のIntegerファミリの何かを使用した短い数学演算では、実行時の符号拡張をより大きなサイズに変換する必要があります。浮動小数点に対して動作するには、符号拡張とIEEE-754への重要な変換が必要です。

  • 証明を見つけることはできませんが、32ビットまたは64ビットのレジスタを使用すると、バイトコードレベルで「プロセッサ命令」を節約できなくなります。プロセッサーレジスターに関する限り、セミトレーラーの駐車場にコンパクトカーを駐車しています。

  • プロジェクトをバイトコードレベルで最適化している場合は、すごいです。すごい。; P

  • このpmd警告を無視するという設計面に同意します。オブジェクトを「短い」と正確に記述し、発生したパフォーマンス変換を比較検討するだけです。

  • 私の意見では、発生したパフォーマンスへの影響はほとんどのマシンでごくわずかです。エラーを無視します。

于 2009-10-23T20:11:02.343 に答える