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

    +88

    1. 1
    2. 2
    3. 3
    StringBuffer sb = new StringBuffer();
    sb.append(xxxxxxxx+","+CLLI+","+fmsRegion+","+fmsAddress);
    sb.append("\r\n");

    Классическое использование стрингбуффера

    Запостил: dms_, 25 Ноября 2011

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

    • строки частью языка сделали, а воспользоватся этим фактом так и не догадались. поэтому и это убожество StringBuffer. и девелоперы должны ручками очевидные оптимизации делать.

      ну да в крестах не лучше...
      Ответить
      • Всё гонево, по умолчанию всё правильно склеивается. StringBuilder нужно использовать только если сложение строк происходит в цикле, или часть строки нужно дописать вызовом метода (пример - Joiner из Guava). StringBuffer лучше вообще не использовать.
        Автор говнокода просто считает себя умнее компилятора.
        Ответить
        • тогда на кой он вообще нужен, эти StringBuilder/StringBuffer? если компилятор умеет не создавать лишних временных копий строк, то тогда эти оба класа не нужны. или чего я, как не-жаба программист, не улавливаю?
          Ответить
          • The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings. String concatenation is implemented through the StringBuilder(or StringBuffer) class and its append method. String conversions are implemented through the method toString, defined by Object and inherited by all classes in Java. For additional information on string concatenation and conversion, see Gosling, Joy, and Steele, The Java Language Specification.

            Read More >>>>>
            http://docs.oracle.com/java se/1.5.0/docs/api/java/lang/String.html
            Ответить
          • Я же написал выше. Компилятор умеет преобразовывать простое сложение строк:
            String result1 = "A" + "B" + "C" + "D";
            //same as
            String result2 = new StringBuilder("A").append("B").append("C").append("D").toString();
            Более сложные случаи (циклы, к примеру) он обрабатывать не может, поэтому в таких случаях нужно использовать StringBuilder напрямую.
            Ответить
            • выглядит логично. в отличии от поведения по умолчанию в крестах. RVO сильно не помогает. может только с С++11-ным move c'tor это можно наконец пофиксить - и тогда конкатенация будет работать аналогично жабе.
              Ответить
            • сановский компилятор сразу преобразует result1 в "ABCD".

              Если правильно помню, когда все слагаемые известны на этапе компиляции компилятор сразу вычисляет выражение и не создает StringBuilder.
              Ответить
              • Да, я немного упростил реальность в целях демонстрации (в аннотациях же можно константные строки складывать, а там ни о каком runtime речь не идёт). Спасибо, что поправили.
                Ответить
                • > Да, я немного упростил реальность
                  Кхм...
                  http://youtu.be/C6v7sb7wMaU?t=4m25s
                  Ответить
            • String result1 = "A" + "B" + "C" + "D";
              //same as
              String result2 = new StringBuilder("A").append("B").append("C").append("D").toString();
              Ааааа. Это верх идиотизма. Переводить работу из компилитайма в рантайм. Я раньше жабу больше уважал. :D
              Ответить
    • >Клиническое использование стрингбуффера
      fixed
      Ответить
    • я один минуснул? было же.
      Ответить

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