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

    +84

    1. 1
    List selection = new ArrayList((s != null) ? s : new ArrayList());

    Больше мусора для бога сборщика мусора!

    Запостил: someone, 05 Декабря 2014

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

    • Сборщику пох, но ГК
      Ответить
      • В любом случае это оверхед.
        Ответить
        • Проблема не в оверхеде (на которых пох если не в цикле), а в неочевидности и лишнем способе записи.
          Ответить
    • Collections.emptyList(), не?

      И где генерики?
      Ответить
      • Да кому они нужны. Что тебе, богоугодного Object'а мало?
        Ответить
      • > И где генерики?

        Это старый код, написанный ещё до Java 5. Я как раз разгребала завалы и добавляла дженерики. Теперь там так:

        final List<SimulationElement> selection = new ArrayList<SimulationElement>();
        
        if (s != null) {
            selection.addAll(s);
        }
        Ответить
      • >Collections.emptyList(), не?
        Да. Кстати вы где-то спрашивали про претензии к тернарникам.
        Так вот, в тернарниках автовывод женерика на этом методе не сработает.
        Придется написать:
        Collections<SimulationElement>.emptyList ()
        Ответить
        • Не, тогда capacity = 0, и тогда сразу после создания придется ее растягивать
          = s != null ? new ArrayList( s ) : new ArrayList();
          Ответить
        • а еще у меня работает без
          Collections.<SimulationElement>emptyList ();
          наверное у меня джава неправильная
          Ответить
          • >а еще у меня работает без Collections.<SimulationElement>emptyList ();
            Что работает?
            Main.java:13: error: incompatible types 
            return arr.length==0 ? Collections.emptyList() : Arrays.asList(arr); ^ 
            required: List<T> 
            found: List<CAP#1> 
            where T is a type-variable: T extends Object declared in method <T>a(T...) 
            where CAP#1 is a fresh type-variable: 
            - See more at: http://ideone.com/kwMRmw#sthash.e2PYGYHb.dpuf

            http://ideone.com/kwMRmw vs http://ideone.com/zQWly0
            В 8-ой пытались чинить генерики, но немного сломали обратную совместимость.
            Ответить
            • Может, это javac vs ecj? ecj работает с дженериками умнее, мы собираем им код, потому что то, что было набрано в Эклипсе, javac не прожёвывает.
              Ответить
              • > ecj работает с дженериками умнее, мы собираем им код
                Пруфы?
                Ответить
                • >> ecj работает с дженериками умнее, мы собираем им код
                  Про то что лет 5 назад в javaс6 был баг c женериками, которого не было в эклипсе, мне известно.
                  Но это было давно и неправда, поскольку его починили хер знает когда.
                  Глагол "работает" же в настоящем времени.
                  Ответить
              • > то, что было набрано в Эклипсе, javac не прожёвывает
                Ну офигеть. Прям вижуалстудия жабомира.
                Ответить
                • >Ну офигеть. Прям вижуалстудия жабомира.
                  Во! Только об этом писал развернуто.

                  Ну и кагбе получается идиотская ситуация, есть некое надмножество компилятора, которое компилирует то что не хочет собирать стандартный javac.
                  В нём можно сделать всякие "полезные" РАСШИРЕНИЯ: добавить там сишный препроцессор, убрать ошибки на checked исключениях, сделать перегрузку операторов. И назвать это джавой.

                  Естественно нашу более "умную" джаву не будет собирать javac. То есть собрать код будет возможно только на ecj.
                  И тут у меня возникает де-жа-вю.
                  Ответить
                  • > И тут у меня возникает де-жа-вю.
                    GHC ?
                    Ответить
                    • Та не, более приземлённо.
                      Улучшениями скучной явы когда-то занималась майкрософт, пока Sun их тово.
                      Вижуалстудия - очень уместная отсылка.

                      PS> В свете того что GHC под крылом Microsoft Research...
                      Ответить
                      • > Та не, более приземлённо.
                        Да, зелёная шутка.
                        В GHC расширения языка нужно явными директивами включать (т.е. тупо положить на спеку не получится), и в реальности можно запилить поддержку аналогичных директив в других компиляторах.
                        Ответить
                  • РАСШИРЕНИЯ надо было написать капсболдом.
                    Ответить
            • Понял мысль. С тернарными операторами вообще веселья хоть отбавляй.
              Вот такой код выдаст 5.0:
              Object value = true ? new Integer(5) : new Double(6);
              А вот такой уже 5:
              Object value = true ? (Object)new Integer(5) : (Object)new Double(6);
              Причем это описано в спецификации
              http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html
              Ответить
    • Утром, а точнее ближе к обеду, он открыл глаза и увидел стоявшую возле его кровати женщину в белом халате.
      Ответить

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