Code Proを使用してアプリケーション コードを確認すると、ツールから次のメッセージが報告されました。
警告: ブール値リテラルを使用した等価テスト
このコードの場合:
boolean valid;
if(valid == true)
これは、次を使用して修正できます。
if(valid)
2 つの質問があります。
- それは単なる良いコーディング慣行ですか?
- メモリの最適化またはパフォーマンスの最適化に関して他に利点はありますか?
Code Proを使用してアプリケーション コードを確認すると、ツールから次のメッセージが報告されました。
警告: ブール値リテラルを使用した等価テスト
このコードの場合:
boolean valid;
if(valid == true)
これは、次を使用して修正できます。
if(valid)
2 つの質問があります。
より直接的なブール式の場合:
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 はコードに単独でベスト プラクティスとしてフラグを立てています。
それは単なる良いコーディング慣行ですか?
はい。2 つの理由:
b == true
イディオムは冗長で、言語的に醜いです。(「教皇がカトリックであるというのは本当ですか?」または「教皇はカトリックですか?」と尋ねますか... ?)
イディオムは、b == true
Java で唯一のケースであり、b = true
.
メモリの最適化またはパフォーマンスの最適化に関して他に利点はありますか?
ほぼ間違いありません。
2 ビットのコードが異なるバイトコードになる場合、JIT コンパイラーがそれらを同じネイティブ命令シーケンスまたは同一のパフォーマンスを持つシーケンスに変換する可能性が最も高くなります。(そうでない場合、オプティマイザーは「トリックを逃しています」)。
いずれにせよ、差が小さすぎて小さすぎて意味がない可能性があります。
それはより良い習慣だと思います。1 つは、コードがよりコンパクトになることです。2 つ目は、コードが自然言語のように読めることです。
いずれにせよメリットがあるかどうかはわかりません。私の推測では、Java コンパイラーは非常に成熟しているため、どちらのオプションもほぼ同じように機能します。
動作に違いはありません。すべての JVM について正式に話すことはできませんが、パフォーマンスに違いがあるとは想像しがたいです。