With a custom comparator, are there any advantages to instantiating it every time instead of creating it as a constant (using anonymous class) and using that single instance? I've always thought that there's no advantage to creating a new instance every time and had always gone the way of option #2 (single instance in static final field).
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());
  }
}
The assumption here is that no state needs to be kept in the comparator.
What if doSomething() gets called a lot? What if doSomething() gets called from multiple threads? What if CUSTOM_COMPARATOR were to be pulled out into a common class and made public instead of private?
If the comparator has no state (and most won't) then it's absolutely fine to create a single instance and use that everywhere. Don't create extra objects just for the sake of it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With