3

Code Proを使用してアプリケーション コードを確認すると、ツールから次のメッセージが報告されました。

警告: ブール値リテラルを使用した等価テスト

このコードの場合:

boolean valid;
if(valid == true)

これは、次を使用して修正できます。

if(valid) 

2 つの質問があります。

  1. それは単なる良いコーディング慣行ですか?
  2. メモリの最適化またはパフォーマンスの最適化に関して他に利点はありますか?
4

4 に答える 4

5

より直接的なブール式の場合:

boolean valid = true;

if(valid) {
}

次のバイト コードが生成されます。

0: iconst_1      
1: istore_1      
2: iload_1       
3: ifeq          6
6: return     

一方、拡張された比較では:

boolean valid = true;

if(valid == true) {
}

次のバイト コードが生成されます。

0: iconst_1      
1: istore_1      
2: iload_1       
3: iconst_1      
4: if_icmpne     7
7: return

私は実行速度に疑問を持っifeqており、if_icmpne異なるため、 の追加コストif(valid == true)は実際には余分な定数値にすぎず、無視できます。

要約すると、実際にはパフォーマンスの違いはなく、CodePro はコードに単独でベスト プラクティスとしてフラグを立てています。

于 2013-03-23T04:49:16.613 に答える
1

それは単なる良いコーディング慣行ですか?

はい。2 つの理由:

  • b == trueイディオムは冗長で、言語的に醜いです。(「教皇がカトリックであるというのは本当ですか?」または「教皇はカトリックですか?」と尋ねますか... ?)

  • イディオムは、b == trueJava で唯一のケースであり、b = true.

メモリの最適化またはパフォーマンスの最適化に関して他に利点はありますか?

ほぼ間違いありません。

2 ビットのコードが異なるバイトコードになる場合、JIT コンパイラーがそれらを同じネイティブ命令シーケンスまたは同一のパフォーマンスを持つシーケンスに変換する可能性が最も高くなります。(そうでない場合、オプティマイザーは「トリックを逃しています」)。

いずれにせよ、差が小さすぎて小さすぎて意味がない可能性があります。

于 2013-03-23T06:05:20.217 に答える
1

それはより良い習慣だと思います。1 つは、コードがよりコンパクトになることです。2 つ目は、コードが自然言語のように読めることです。

いずれにせよメリットがあるかどうかはわかりません。私の推測では、Java コンパイラーは非常に成熟しているため、どちらのオプションもほぼ同じように機能します。

于 2013-03-23T04:43:24.597 に答える
0

動作に違いはありません。すべての JVM について正式に話すことはできませんが、パフォーマンスに違いがあるとは想像しがたいです。

于 2013-03-23T04:41:02.200 に答える