2017-01-26 4 views
1

は最近、私はコードレビューを行うと、この男に出くわした:if文でラップされた3値を悪用して呼び出す条件付きメソッド?

if(!sharePermission.isExpired() ? activePermissions.add(sharePermission) : expiredPermissions.add(sharePermission)); 

は、基本的にはブール値を返し、割り当ての要件を満たすためにif(...)文でそれを包むメソッドを呼び出すif文三元を使用します。これは多かれ少なかれ有効ですか

if(!sharePermission.isExpired()) 
    activePermissions.add(sharePermission); 
else 
    expiredPermissions.add(sharePermission); 

本当にコードを1行に凝縮する必要がある場合は、代入が実際に発生している場合、if(...)に割り当てられるスペースはありますか?

私はそれらのいずれかのファンではなく、ちょうど興味があります。

+1

それは確かにもっと奇妙だ「よりも、この多かれ少なかれ有効です」。私は何が起こっていたかを理解するためにこれを数回読まなければならなかった。 –

+1

'(sharePermission.isExpired()?activePermissions:expiredPermissions).add(sharePermission);'についてあなたが削除したコメントを見ました。投稿したアイテムがチーム環境の反パターンのように感じられることに同意するでしょう。あなたはもう少しエレガントでした。 – saganaut

+2

私はそれが特に好きではないので、削除しました。 'List list = isExpired()が好きですか?期限切れ:アクティブ。 list.add(sharePermission); '。 –

答えて

3

に相当します。評価の結果に余分なメモリーは割り当てられません。三元声明をエミュレートするために三元表現を使用して

は、しかし、著しく異例です。追加の利益をもたらすことなく、コードの可読性を低下させます。したがって、普通のifelseを使用する方が良い方法です。もしactivePermissionsexpiredPermissionsが同じタイプであることを

注意次のように、あなたは、add呼び出しのターゲット間で決定する三元表現を使用することができます。

(sharePermission.isExpired() ? expiredPermissions : activePermissions).add(sharePermission); 
+0

ありがとう - これはまさに私が不思議に思っていたものです。 – saganaut

+0

@GrzegorzGórkiewicz条件文を 'if'にネストすることは必要ありません。もしあなたが望むのが副作用であれば。 – dasblinkenlight

+0

ちょうど同じ型のものだから... –

0

あなたが探しているif..elseための三元相当のようなものさ -

(!sharePermission.isExpired() ? activePermissions : expiredPermissions).add(sharePermission); // no if here 

は何の割り当て起こって、boolean条件の唯一の評価はありません

if(!sharePermission.isExpired()) { 
    activePermissions.add(sharePermission); 
} 
else { 
    expiredPermissions.add(sharePermission); 
} 
+1

しかし、これは、例えば、 'if(activePermissions.add(sharePermission))'。 –

+1

"あなたが探しているif..elseの三項相当は、「しかし、それはそうではありません。条件演算子を文式として使用することはできません。 –

+1

右ですが、その三項は文ではないのでコンパイルされません。それでなぜ原文がif_statement_にラップされたのですか? – saganaut

4

それはif声明への虐待ですそれをして、条件式を気にしないでください。

どちらかのフルif文を書くために、またはに追加するリストを選択するための条件演算子を使用するようにきれいになります:

List<Permission> list = isExpired() ? expiredPermission : activePermission; 
list.add(sharePermission); 
関連する問題