最近のコードレビューで、Javaでternary operator (condition ? foo : bar)
との両方XOR operator ^
が使用されることはほとんどないことを読みました。本当ですか?
はいの場合、読みにくいためでしょうか?またはその他の理由。
最近のコードレビューで、Javaでternary operator (condition ? foo : bar)
との両方XOR operator ^
が使用されることはほとんどないことを読みました。本当ですか?
はいの場合、読みにくいためでしょうか?またはその他の理由。
回答:
三項演算子は、特に短いnullチェック/デフォルトに対してよく使用されます。
System.out.println("foo is "+(foo==null) ? "not set" : foo);
これをif / elseほど読みにくいと考える人もいますが、それは問題ではありませんでした。
XOR ビット演算子は、ビット処理でのみ使用されます。ビット単位のXORが必要な場合、それを回避する方法はありません。
XOR 論理演算子は確かに非常にまれなので、Java で過去10年間有効なケースでそれを見たことがありませんでした。これは、ブールXORが||
またはのように「スケーリングしない」という事実にも起因し&&
ます。私が意味したのは:
if( a && b && c && d ) .... // it's clear what the intention is
if( a || b || c || d ) .... // here also
if( a ^ b ^ c ^ d ) .... // ???
私が推測する最後のケースでは、コーダーは「1つだけが真実であるべき」を意味しました。しかし、XORは獣です。コーダーは獣を手に入れましたが、彼が望んだものではありませんでした。
それは興味深いインタビューの質問になりif
ます。最後の結果は何ですか?
!=
ブール値を数回使用したことがあり、論理XORは私の心を越えたことさえありません。
以前は解析が難しい三項演算子を見つけましたが、それが非常に役立つ場所がいくつかあることに気づきました。これらはアプリケーションロジックではなく、ロギングです。
例えば:
log.info( "Object foo is " + ( foo.isEnabled() ? "" : "not " ) + "enabled" );
私にとって、それはどちらよりもすっきりしている
if ( foo.isEnabled() )
log.info( "Foo is enabled" );
else
log.info( "Foo is not enabled" );
または
log.info( "Foo is enabled : " + foo.isEnabled() );
要約すると、それはそれがどこで使用されているかという問題です。
ビットに関しては、私はまだそれらに苦労していますが、それは、他のコメンターが示唆しているように、高度な抽象化で作業することに慣れているためです。コードのどこかでそれを使用して「効率的」にすることにした場合、私がそれを理解するのに費やされた時間は、メリットを打ち消します。
foo.setParam( bool ? ClassA.method() : ClassB.method )
。動作しますが、IMOは少しにおいがします。
unless ( !bool ) {
。:)