2013-12-25 4 views
0

Я предпочитаю использовать поле static для экземпляров классов, которые не сохраняют его состояние в полях вместо анонимных-внутренних классов. Я думаю, что эта хорошая практика для уменьшения объема памяти и использования GC, если метод sort (или другой) вызывает очень часто. Но мой коллега предпочитает использовать анонимные внутренние классы для этого случая, говоря, что JIT оптимизирует его.anonymous-internal-classes vs static field

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. Пожалуйста, расскажите, пожалуйста, хорошую практику для этого случая.

+0

Nitpick: ваш собственный пример на самом деле не имеет смысла. Поскольку у MyClass есть только один порядок, и он знает об этом, он должен просто реализовать 'Comparable ', вместо того, чтобы иметь статическое поле' compator' типа 'Comparator '. – ruakh

+1

Ваш вопрос действительно - «анонимные-внутренние классы против названных классов». И мой ответ будет заключаться в том, что анонимные-внутренние классы созданы для более быстрого и легкого написания кода, но при необходимости вы всегда должны использовать более читаемые именованные классы с возможностью повторного использования. – Elist

+0

@ruakh Это гипотетический пример. Вместо компаратора может быть другой класс. –

ответ

2

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

Ну, это наоборот. Если вас беспокоит память, поля static будут находиться в памяти до тех пор, пока класс не будет выгружен.

Однако проблема заключается в большей читаемости, а не в памяти или производительности. Если вы обнаружите, что использование экземпляра Comparator может быть 2-3 раза или более, лучше сохранить это в поле, чтобы избежать повторения кода. Еще лучше, отметьте поле final. Если вы собираетесь использовать его только один раз, нет смысла хранить его как поле static.

Но мой коллега предпочитает использовать анонимные внутренние классы для этого случая, говоря, что JIT оптимизирует его.

Я не понимаю, о какой оптимизации говорит ваш коллега. Вы должны спросить его/ее для дальнейшего уточнения. ИМО, это только предварительная оптимизация, и вам действительно не стоит беспокоиться.

+0

Конечно, я забыл отметить финал. –