2012-10-25 7 views
11

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

答えて

17

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

+0

ちょうど好奇心のために、どんなタイプのコンパレータに状態がありますか? – climbage

+1

まあ、(不変の)入力に基づいて 'Comparator'を作成するメソッドがあるかもしれません。それはまさに国家ではないでしょうが、異なる入力に対して異なるコンパレータを構築する必要があります。 –

+0

@climbage:私は理論では*あなたは異なるモードを持つことができるかもしれないと思います。あなたが望むときにモードを変更することができます。しかし、それは非常に奇妙になるでしょう:) –

関連する問題