カスタム コンパレータを使用すると、(匿名クラスを使用して) 定数として作成し、その単一のインスタンスを使用する代わりに、毎回インスタンス化する利点はありますか? 私は常に、毎回新しいインスタンスを作成する利点はないと考えており、常にオプション #2 (静的最終フィールド内の単一インスタンス) を使用していました。
public class SomeClass {
//First option:
private static class SomeCustomComparator implements Comparator<SomeObject> {
public int compare(SomeObject o1, SomeObject o2) {
/*implementation*/
}
}
//Second option:
private static final Comparator<SomeObject> CUSTOM_COMPARATOR = new Comparator<SomeObject> {
public int compare(SomeObject o1, SomeObject o2) {
/*implementation*/
}
};
public void doSomething() {
//are there any advantages to one over the other?
SortedSet<SomeObject> s1 = new TreeSet<>(CUSTOM_COMPARATOR);
SortedSet<SomeObject> s2 = new TreeSet<>(new SomeCustomComparator());
}
}
ここでの前提は、コンパレーターに状態を保持する必要がないということです。
doSomething() が頻繁に呼び出されるとどうなるでしょうか? doSomething() が複数のスレッドから呼び出された場合はどうなりますか? CUSTOM_COMPARATOR が共通クラスに取り出され、非公開ではなく公開にされたらどうなるでしょうか?