1. Java / Говнокод #12597

    +121

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    public class DefaultQueryEngine implements QueryEngine {
    
        private static volatile QueryEngine DEFAULT;
        
        public static QueryEngine getDefault() {
            if (DEFAULT == null) {
                DEFAULT = new DefaultQueryEngine(new DefaultEvaluatorFactory(CollQueryTemplates.DEFAULT));
            }
            return DEFAULT;
        }

    https://github.com/mysema/querydsl/blob/master/querydsl-collections/src/main/java/com/mysema/query/collections/DefaultQueryEngine.java

    Ехал дефолт через дефолт...

    Запостил: someone, 15 Февраля 2013

    Комментарии (9) RSS

    • Какой потокобезопасный дефолт...
      Ответить
      • а в жабе нет атрибутов как в шарпике? типа [MethodImpl(MethodImplOptions.Synchronize d)]
        P.S. погуглил, вроде как synchronized должно быть в сигнатуре функции.
        Ответить
      • Да ладно. Создадутся несколько DefaultQueryEngine'ов - ничего страшного.
        Ответить
        • уважайте труд уборщика, не мусорите
          Ответить
        • Ну на самом деле проблемки могут повылазить (ну если не в данном случае, то в более общем)...

          Во-первых QueryEngine может использовать какие-то эксклюзивные ресурсы, которые второму могут просто не достаться.

          Во-вторых - допустим что у QueryEngine есть список ивентЛисенеров, какой-нибудь объект вызвал getDefault, подписался на ивенты, но в этот момент другой поток тоже вызывал getDefault, и в DEFAULT попала именно его версия. Тогда первый объект не получит каких-то событий, возможно важных, а остальные, в свою очередь, не увидят событий, инициированных действиями первого.

          Ну и еще что-нибудь связанное с тем, что getDefault() может вернуть несколько различных объектов, если его пользователи ожидают один общий.

          Если такие проблемы в данном случае не страшны - ну да, ничего плохого, просто дворнику чуть-чуть больше работы.
          Ответить
    • если DEFAULT заменить на instance, то брюки превращаются мы видим обычный потоконебезопасный ленивый синглтон.
      правда, volatile зачем?
      Ответить
      • > volatile зачем
        Чтобы он стал потокобезопасным почти синглтоном.
        Ответить
      • Здесь лучше было применить паттерн instance holder.
        Ответить

    Добавить комментарий