2016-08-23 8 views
3

私はいくつかのコードの最適化を実行しようとしていますし、オブジェクトのための私の現在のユニークなタイトルの検証は次のようになります。それはどこかんしゃくをスローするまで、Javaのスキップnullオブジェクト.equalsで返す()

public boolean validateTitle(RawProfileConstraint rawProfileConstraint) { 
    RawProfileConstraint result = profileConstraintMapper.validateTitle(rawProfileConstraint.getTitle()); 
    return (!rawProfileConstraint.getTitle().equals(result.getTitle())); 
} 

これは動作しますデータベースは、私が検証しようとしているタイトルを含むレコードを取得することができません - それは利用可能です。この場合、resultnullになります。 この場合、nullのハンドラを通常のif-elseなしで組み込むにはどうすればよいですか? resultがそれを逆参照する前にnullの場合

+2

なぜ "いつものなし'場合-else'"? –

+0

三元状態?:P – AxelH

+1

ヒント:あなたの名前は混乱します。 "マッパー"のvalidateTitleメソッドはRawProfileConstraintオブジェクトを返します。表示しているvalidateTitleメソッドはブール値を返します。それは少なくとも矛盾している!私の意見では、バリデーションメソッドは無効にし、無効な入力の例外をスローする必要があります。意味のある情報を伝える「実物」を返すことになります。 true/falseを返すだけです。それは1995年のCプログラミングスタイルに似ています。意味:メソッドの名前を変更することを検討してください。それらが「同じように働く」と考えてください。 – GhostCat

答えて

5

単にチェック:

return result != null 
    && !rawProfileConstraint.getTitle().equals(result.getTitle()); 

または

return result == null 
    || !rawProfileConstraint.getTitle().equals(result.getTitle()); 

あなたは結果が(それぞれfalsetrue)ときresult == nullなりたいものに依存します。

&&||ショートなので、彼らが必要な場合を除き、右のオペランドを評価しません。

  • false && anything == falseを、そうanything
  • true || anything == trueを評価する必要はありません、そうする必要はありませんnullをチェック回避する1つのオプションがOptional(私を使用することですanything
+0

ありがとうございました。私は私が思っていたことを思い知らされ、他のことを念頭に置いて全体像を正しく見ることができませんでした。ありがとう、andyとghostcat。 – Kei

1

を評価あなたは、Java 8)を使用しているF:

Optional.ofNullable(result).map(RawProfileConstraint::getTitle).orElse("") 
0

result.getTitle() 

を交換し、私は戻ってステップすることをお勧め。なぜあなたはif/elseを使うのが悪い考えだと思いますか?

はあなたが本当にAndyTが提案されているよう

public boolean validateTitle(RawProfileConstraint rawProfileConstraint) { 
RawProfileConstraint result = profileConstraintMapper.validateTitle(rawProfileConstraint.getTitle()); 
if (result == null) { 
    return false; 

return (!rawProfileConstraint.getTitle().equals(result.getTitle())); 

ようなソリューションがそんなにリターンを使用するよりも読み、「難しい」と& &だと思いますか?あるいは、Eranが提案する「1つの表現の中の4つの流暢な文」?

さらに、ifを使って...あなたの検証メソッドに概念的な問題があることも明らかになります。 nullの結果がfalse(またはtrue)を引き起こすはずです。

ストーリー・ショート:検証呼び出しのために内部的に使用している「インターフェース」を元に戻して考え直すと、コードが最大になると思います。

0

Ternary operatorが役立つことができます:

return reusult!=null?(!rawProfileConstraint.getTitle().equals(result.getTitle())):false; 
+0

'a? b:false'は 'b'がブール型であれば単に' a && b'です。三項演算子の必要はありません。 –

+0

ありがとう@AndyTurnerの提案 –

関連する問題