2017-08-23 5 views
0
public int compare(Event e1, Event e2) { 
    if (e1 == null && e2 == null) { 
     return 0; 
    } else if (e1 == null && e2 != null) { 
     return -1; 
    } else if (e1 != null && e2 == null) { 
     return 1; 
    } else if (e1.getDate() == null && e2.getDate() == null) { 
     return 0; 
    } else if (e1.getDate() == null && e2.getDate() != null) { 
     return -1; 
    } else if (e1.getDate() != null && e2.getDate() == null) { 
     return 1; 
    } else 
     return e1.getDate().compareTo(e2.getDate()); 
} 

コンパイラの練習のために上記のコードを書くより良い方法についてお聞きしたいと思います。 要件は、2つのヌル値が等しく、ヌル値が非ヌル値より常に(比較して)小さい方法でヌル値を処理することです。オブジェクトと日付のJavaカスタマイズされた比較メソッド

このコードは完全に機能していますが、それは私には不慣れなようです。 ここにいくつかの意見と心のオープナーを聞きたいです:)

+1

この質問は[コードレビュー](https://codereview.stackexchange.com/) – Guy

+0

より適している。またhttps://stackoverflow.comに見て/ que stions/39804174/how-to-handle-null-compare-メソッド-arguments-in-comparator – Girish007

答えて

0

あなたはほとんどそこにあります。余分な不要なチェックを削除することができます。

またreturnですので、else ifを使用する必要はありません。あなたがnullとの比較をスキップすることはできません

public int compare(Event e1, Event e2) { 
    // nulls are equal 
    if (e1 == null && e2 == null) { 
     return 0; 
    } 
    // A null is always less than anything. 
    if (e1 == null) { 
     return -1; 
    } 
    if (e2 == null) { 
     return 1; 
    } 
    // null dates are equal 
    if (e1.getDate() == null && e2.getDate() == null) { 
     return 0; 
    } 
    // A null is always less than anything. 
    if (e1.getDate() == null) { 
     return -1; 
    } 
    if (e2.getDate() == null) { 
     return 1; 
    } 
    // All present - use normal date comparison. 
    return e1.getDate().compareTo(e2.getDate()); 
} 
0

、あなたはnullを比較しないまたは多分あなたは、これは例えば非常に主観的である、いくつかのprittierコードを書くことができることを知らせるためにNullPointerExceptionを投げることができ、次のいずれか

public int compare(Event e1, Event e2) { 
    if (e1 == null) return -compareToNull(e2); 
    if (e2 == null) return compareToNull(e1); 
    if (e1.getDate() == null) return -compareToNull(e2.getDate());  
    if (e2.getDate() == null) return compareToNull(e1.getDate()); 
    return e1.getDate().compareTo(e2.getDate()); 
} 

private int compareToNull(Object e) { 
    return e == null ? 0 : 1; 
} 

やコードのゴルフスタイル:

public int compare(Event e1, Event e2) { 
    if (e1 == null || e2 == null) return compareNull(e1, e2); 
    if (e1.getDate() == null || e2.getDate() == null) return compareNull(e1.getDate(), e2.getDate()); 
    return e1.getDate().compareTo(e2.getDate()); 
} 

private int compareNull(Object e1, Object e2) { 
    return e1 == null && e2 == null ? 0 : e2 == null ? 1 : -1; 
}