6

私は次のスタイルのJavaソースコードに取り組んでいます:

if (0 == var) {}
and 
if (null == someObj) {}

また

if (0 != var) {}
and 
if (null != someObj) {}

次のように書き直す必要があります。

if (var == 0) {}
and 
if (someObj == null) {}

前もって感謝します!。

4

4 に答える 4

13

次のことは完全に有効です。

if (0 == var) {}
and 
if (null == someObj) {}

の代わりにシングルを誤って使用することを防ぐために、ヨーダ記法と呼ばれることで有名です。===

個人的には使ったことがありません。しかし、それが好きな人もいます。それは本当に好みの問題です。


ただし、Javaでは役に立ちません。なぜなら、そのような偶発的なタイプミスはコンパイル時にキャッチされるからです。

次の場合、Javaでコンパイル時エラーが発生します。

if( var = 0 ) 
{
//Some code
}

代入演算はJavaではブール値を生成しないためです。ただし、C / C ++などの言語では、上記は有効であり、警告が有効になっていない場合、コンパイラはエラーを出しません。上記のif条件は、C / C ++では常にfalse(0)と評価されます。そのため、実行時に見過ごされ、予期しない結果が生じる可能性があります。

GCCでは、すべての警告が有効になっていると、CまたはC++で上記の警告が表示されます。

warning: suggest parentheses around assignment used as truth value

したがって、これはC / C ++でもあまり役に立たない可能性があります。これは、すべての警告を使用してコンパイルし、すべての警告を修正することが期待されているためです。前に言ったように、それは個人的な選択であり、違いはありません。

有効な構文であり、ヨーダif ( 0 == var){}記法と同じif (var == 0) {}です。

于 2012-12-14T23:17:10.280 に答える
4

一般的に、書くこと0 == nはと呼ばれyoda conditionます。あなたがそれを大声で言うならば、あなたは言うからですif zero equals my var

と書く方がいいn == 0です。しかし、それはまったく同じです。しかし、それはよりよく読まれます。

条件の長所のいくつかは、Javaには適用されません。

if (value = 42)

コンパイルエラーが発生します。javaので有効な入力ではないをvalue = 42生成します。しかし、で完全に合法です。intifC

constant左側のを使用して比較することは、一般的なベストプラクティスです。ただし、Objectequalsメソッドを使用する場合のみ。

if ("CONSTANT".equals(myString))

がnullの場合、または変数にアクセスできないためにmyString比較している場合は、nullをチェックしても意味がありません。primitives.equals()

if ( "CONSTANT" == null )

私の意見ですが、利点は読みやすさだけです。

于 2012-12-14T23:17:31.610 に答える
0

最初のスタイルは、偶然ではvar = nullなく、var == nullCやC ++などの言語ではキャッチしにくいバグですが、null = varコンパイルされないためキャッチしやすいため、一部の人に好まれています。コメントに記載されているように、これはnull = varブール式ではないため、Javaには適用されません。

于 2012-12-14T23:17:28.237 に答える
0

この種の用語は、英語の自然言語と比較して「後方」であるため、 「ヨーダ表現」と呼ばれます。

私はそれが割り当てで報われるとは思いません-優れたコード監査ツールはこれらのタイプのエラーをキャッチし、ほとんどはより厳密なJavaコンパイラによってすでにキャッチされているはずです(Cの一般的なタイプミスの=代わりに使用してください!)==

ただし、compareToメソッドを使用する場合は、値を考慮する必要がありnullます。

 if ("example".equals(input))

NullPointerExceptionより「自然な」間、に遭遇することはできません

 if (input.equals("example"))

可能であり、値の追加チェックが必要nullです。

于 2012-12-14T23:22:08.077 に答える