12

カスタム コンパレータを使用すると、(匿名クラスを使用して) 定数として作成し、その単一のインスタンスを使用する代わりに、毎回インスタンス化する利点はありますか? 私は常に、毎回新しいインスタンスを作成する利点はないと考えており、常にオプション #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 が共通クラスに取り出され、非公開ではなく公開にされたらどうなるでしょうか?

4

1 に答える 1

19

コンパレーターに状態がない場合 (ほとんどの場合はそうではありません)、単一のインスタンスを作成し、それをどこでも使用することはまったく問題ありません。そのためだけに余分なオブジェクトを作成しないでください。

于 2012-10-25T17:50:08.850 に答える