2017-09-22 13 views
0

シナリオ

に違反し、私はstartDateendDateを持つオブジェクトを得ました。両方がnot null の場合timeDiffが設定され、これらの2つの日付の時間差はLongで計算されます。条件付きヌルオブジェクト:比較方法は、その一般的な契約

ユースケース

timeDiffを持つすべてのオブジェクトは、最初に最後休む必要があります。

コンパレータ

HFehlerProtPairComparator

if (sortFieldName.equals(HFehlerProtPairFields.EREIGNISDATUM_DIFFERENZ.getName())) { 
      if (null != firstO.getStartDate() && null != firstO.getEndDate() 
        && null != secondO.getStartDate() && null != secondO.getEndDate()) { 
       compare = firstO.getTimeDiff().compareTo(secondO.getTimeDiff()); 
      } else { 
       compare = -1; 
      } 

     } 

は私が欠けているものを見当がつかないとデバッグは、ここで私を助けにはなりません。私は紙でそれを確認しようとしましたが、私はそこにも私のエラーが表示されません。

呼び出し階層

comp = new HFehlerProtPairComparator(field.getName(), SortType.ASC.name()); 
Error ==> Collections.sort(unsortedHFehlerProtPairList, comp); 

スタック

at java.util.TimSort.mergeHi(TimSort.java:899) 
at java.util.TimSort.mergeAt(TimSort.java:516) 
at java.util.TimSort.mergeForceCollapse(TimSort.java:457) 
at java.util.TimSort.sort(TimSort.java:254) 
at java.util.Arrays.sort(Arrays.java:1512) 
at java.util.ArrayList.sort(ArrayList.java:1454) 
at java.util.Collections.sort(Collections.java:175) 
at uebergreifendeereignis.UeHFehlerProtPairListController.sortBySortMap(UeHFehlerProtPairListController.java:360) 
+0

実際のエラーを含む例外スタックトレースの先頭を送信するのを忘れました。 –

答えて

2

問題は、状況によっては、AとBを比較したときと、BをAと比較したときにコードが-1を返すということです。たとえば、開始日のないオブジェクトAと、終了日のないオブジェクトBがあるとします。コンパレータがパラメータリスト(A, B)で呼び出されると、AがBより小さいことを示す-1が返されます。

これ以降、パラメータリスト(B, A)でコンパレータが呼び出される可能性があります。それも-1を返します。つまり、B < A.

コンパレータの契約に違反しています。規則は、コンパレータが(A、B)に対して-1を返す場合、(B、A)に対して1を返す必要があると言います。つまり、A < Bの場合はB> Aです。コードがその契約を満たしていません。

コードを機能させるには、開始時間または終了時間が定義されていないときの時間差を比較することを意味するものを決定する必要があります。 A.startDateがnullの場合、timeDiffは未定義です。 Bに有効な時間差がある場合、BはAより大きい、等しい、またはより小さいと見なすべきですか?

私の以前の回答と同様に、いくつかの考慮すべき条件があります。

A.timeDiff B.timeDiff result 
undefined undefined equal 
undefined valid  ?? 
valid  undefined ?? 
valid  valid  A.timeDiff.compareTo(B.timeDiff) 

どちらか一方が定義されていない場合の結果はどうなるかはあなた次第です。しかし、あなたが何をしても、結果として生じるコードは契約を尊重する必要があります。

+0

あなたは 'timeDiff'を比較しようとしています。 – 0x45

+0

@ 0x45:そうです。私はその質問を誤解した。 –

+0

@ 0x45:私の更新された回答を見る –

2

あなたがたstartDateもendDateに設定さもないと、オブジェクトを持っていて、自分自身にそれを比較した場合、あなたのコンパレータが与え-1結果として。

関連する問題