С помощью пользовательского компаратора существуют ли какие-либо преимущества для его создания каждый раз вместо того, чтобы создавать его как константу (используя анонимный класс) и использовать этот единственный экземпляр? Я всегда думал, что нет никакого преимущества создавать новый экземпляр каждый раз и всегда шел путь варианта №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 нужно было вытащить в общий класс и сделать публичным, а не частным?