インターフェイスの 2 つのオブジェクトを比較するメソッドを実装したいと思いますTask
。には厳密な部分順序しかないため、2 つのオブジェクトが比較できない場合にのみ、Task
をpartialCompareTo
返す必要があります。null
厳密な半順序付けの概念に混乱している場合は、こちらを確認してください: https://en.wikipedia.org/wiki/Partially_ordered_set
動機: 一部のタスクには、別のタスクの前または後に実行する必要があるという制約があります。次に、これを使用してタスクをトポロジカルに並べ替えます。つまり、すべての制約が満たされるようにタスクを配置します。
Task
a
およびのすべてのインスタンスに対して、次のプロパティが必要ですb
。
- もしそう
a.partialCompareTo(b) != null
ならsgn(a.partialCompareTo(b)) = -sgn(b.partialCompareTo(a))
- もしそう
a.partialCompareTo(b) = null
ならb.partialCompareTo(a) = null
注:Comparable
標準ライブラリのインターフェイスは使用できません。Task: in returnsには完全な順序付けがないためです。2 つのオブジェクトがincomparableである場合、適切な結果を得る方法はありません。特に、その実装のインスタンスが互いに比較できないTask の実装があります(ただし、 をオーバーライドする Task の他のサブクラスのインスタンスと比較できる場合があります)。compareTo
Comparable
int
partialCompareTo
partialCompareTo
クラスで指定されたメソッドをオーバーライドする場合、引数のメソッドを使用するという考え方ですTask
。
次のアプローチは、実際の試行というよりも冗談です。比較できない 2 つのオブジェクトが比較されるたびに StackOverflowError が発生するためです (これはキャッチされますが、とにかくこれは実現不可能です)。
public class Task implements TopologicalComparable<Task> {
/*
* other code
*/
@Override
public Integer partialCompareTo(Task other) {
Integer result;
try {
result = - other.partialCompareTo(this);
} catch (StackOverflowError | NullPointerException e) {
return null;
}
return null;
}
}
次の実装は明らかに優れていますが、常にヘルパー メソッドをオーバーライドする必要があるという欠点がありますoverridesDefaultPartialCompareTo
。
public class Task implements TopologicalComparable<Task> {
/*
* other code
*/
@Override
public Integer partialCompareTo(Task other) {
if (other.overridesDefaultPCompareTo()) {
Integer revComp = other.overridesDefaultPartialCompareTo(this);
if (revComp != null) {
return - revComp;
}
}
return null;
}
public default boolean overridesDefaultPartialCompareTo() {
return false;
}
}
メソッドがコードで上書きされているかどうかを確認する方法はありますか?
または、私の問題を解決するための代替アプローチはありますか?