Должны ли компараторы создаваться каждый раз или только один раз?

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


person Andrey    schedule 25.10.2012    source источник


Ответы (1)


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

person Jon Skeet    schedule 25.10.2012
comment
Просто ради любопытства - какой тип компаратора будет иметь состояние? - person Mike Park; 25.10.2012
comment
Что ж, у вас может быть метод, который создает Comparator на основе его (неизменяемого) ввода. Само по себе это не было бы состоянием, но вам нужно было бы построить разные компараторы для разных входных данных. - person Louis Wasserman; 25.10.2012
comment
@climbage: Я думаю, что теоретически у вас мог бы быть один, который мог бы иметь разные режимы, и вы могли бы изменить режим, когда захотите. Но это было бы очень странно :) - person Jon Skeet; 25.10.2012
comment
@climbage Я могу представить себе компаратор, который меняет поведение, увидев специальный элемент. Хотя никогда не реализовывал такие :) - person jlordo; 25.10.2012
comment
Ах да, разные режимы. Я представлял себе изменение состояния во время каждого сравнения, что было бы... прискорбно. - person Mike Park; 25.10.2012
comment
Эх, изменяемый компаратор, во-первых, кажется действительно плохой идеей. - person Louis Wasserman; 25.10.2012