english | блог | контакт
Mon, 30 Aug 2010 @ 14:24

Inner-классы и фабрики

Теги: java

Мне нравится использовать double-brace инициализацию: это удобно и быстро.

Сегодня, после очередной умной книжки, задумался. И в голову пришёл относительно синтетический, но возможный пример:

  • имеем некий DAO, который вызывает некий Callback
  • callback сохраняет в себе Connection (для удобства, например) и возвращает результат работы как список Map-ов
  • map-ы инстанциируются как inner-классы

  • В результате имеем потенциальную утечку соединений на время жизни результатов запроса.

    Ниже "проверочный код".

    import java.lang.ref.*;
    
    class Child {
    }
    
    interface Creator {
        Child create();
    }
    
    class Creator1 implements Creator {
        public Child create() {
            return new Child();
        }
    }
    
    class Creator2 implements Creator {
        public Child create() {
            return new Child() { /* inline class */ };
        }
    }
    
    public class TestParentLink {
    
        static void test(Class<? extends Creator> creatorClass) throws Exception {
            Reference<Creator> r;
            Child ch;
            {
                Creator creator = creatorClass.newInstance();
                ch = creator.create();
                r = new WeakReference<Creator>(creator);
                creator = null;
            }
            System.gc();
            System.out.println(r.get());
        }
    
        public static void main(String[] args) throws Exception {
            System.out.print("testing correct creator: ");
            test(Creator1.class);
            System.out.print("testing leaking creator: ");
            test(Creator2.class);
    
        }
    
    }