Следует ли создавать компараторы каждый раз или только один раз?

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

Ответ 1

Если у компаратора нет состояния (и большинство из них не будет), то абсолютно точно создать один экземпляр и использовать его везде. Не создавайте лишние объекты только ради него.