0

static匿名内部クラスではなく、フィールドに状態を格納しないクラスのインスタンスにフィールドを使用することを好みます。sortメソッド(または他の)が頻繁に呼び出される場合、メモリとGCの使用量を減らすためのこの良い習慣だと思います。しかし、私の同僚は、JIT がそれを最適化すると言って、この場合には匿名内部クラスを使用することを好みます。

class MyClass {
    //non fields of class

    /*access modifier*/ final static Comparator<MyClass> comparator = new Comparator<MyClass>(){
        public compare(MyClass o1, MyClass o2){
            //comparing logic
        }
    }
}

使用例(私が好む):

List<MyClass> list = ...;
Collection.sort(list, MyClass.comparator);

使用例 (私の同僚が好む):

List<MyClass> list = ...;
Collection.sort(list, new Comparator<MyClass>(){
    public compare(MyClass o1, MyClass o2){
        //comparing logic
    }
});

1.最適化されたopenJDKで匿名内部クラスを使用していますか?
2.この場合の良い習慣を教えてください。

4

1 に答える 1

2

メソッドsort(またはその他)が頻繁に呼び出される場合、メモリとGCの使用量を減らすためのこの良い習慣だと思います。

まあ、それは逆です。メモリが気にstaticなる場合は、クラスがアンロードされるまでフィールドがメモリ内に存在します。

ただし、ここでの懸念は、メモリやパフォーマンスよりも読みやすさです。Comparatorインスタンスを 2 ~ 3 回、またはそれ以上使用している場合は、コードの繰り返しを避けるために、それをフィールドに格納することをお勧めします。さらに良いことに、フィールドをマークしますfinal。一度だけ使用する場合は、staticフィールドとして保存する意味がありません。

しかし、私の同僚は、JIT がそれを最適化すると言って、この場合には匿名内部クラスを使用することを好みます。

あなたの同僚が話している最適化の種類がわかりません。彼/彼女にさらに説明を求める必要があります。IMO、これは時期尚早の最適化であり、気にする必要はありません。

于 2013-12-25T08:19:27.103 に答える