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