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

    +69

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    public static Integer valueOf(int i) {
            if(i >= -128 && i <= IntegerCache.high)
                return IntegerCache.cache[i + 128];
            else
                return new Integer(i);
        }

    Код java.lang.Integer

    из этого как минимум следует что: Integer.valueOf(-130) != Integer.valueOf(-130).

    Запостил: KoderZ, 08 Декабря 2010

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

    • А еще смущает магичность числа 128.
      Ответить
      • >Iteger.valueOf(-130) != Integer.valueOf(-130)
        омич чтоле?
        джважды сработает return new Integer(-130);
        ты еще строки через == посравнивай
        Ответить
        • так пул же
          правда, для 130 не сработает

          а вот
          Iteger.valueOf(1) == Integer.valueOf(1)

          Ваш КО
          Ответить
          • Я о разном поведении для разных значений. Может старались кешировать наиболее использованные значения, но почему именно 128?
            Ответить
          • а у меня такие сырцы
            private static class IntegerCache {
            	private IntegerCache(){}
            	static final Integer cache[] = new Integer[-(-128) + 127 + 1];
            	static {
            	    for(int i = 0; i < cache.length; i++)
            		cache[i] = new Integer(i - 128);
            	}
                }
            
                /**
                 * Returns a <tt>Integer</tt> instance representing the specified
                 * <tt>int</tt> value.
                 * If a new <tt>Integer</tt> instance is not required, this method
                 * should generally be used in preference to the constructor
                 * {@link #Integer(int)}, as this method is likely to yield
                 * significantly better space and time performance by caching
                 * frequently requested values.
                 *
                 * @param  i an <code>int</code> value.
                 * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
                 * @since  1.5
                 */
                public static Integer valueOf(int i) {
            	final int offset = 128;
            	if (i >= -128 && i <= 127) { // must cache 
            	    return IntegerCache.cache[i + offset];
            	}
                    return new Integer(i);
                }

            но это херня. в java.awt вещи поинтереснее встречаются

            это написано не для быдла не знающего жабы и сравнивающего Integerы через "==".

            подчеркиваю
            as this method is likely to yield significantly better space and time performance by caching frequently requested values.
            КОММЕНТЫ ДЕВОВ НЕ ЧИТАЙ
            @
            НА ГОВНОКОД ЗАЛИВАЙ
            Ответить
            • Никто не сравнивает, то я про разность поведения хотел сказать, а вот оптимизания сомнительная.
              Ответить
              • думаю девам видней.
                оптимизация - нормал.
                реализация - попахивает.
                хотя конечно когда я впервые увидел new Integer[-(-128) + 127 + 1];
                тоже просмеялся.

                >но почему именно 128?
                0_0
                Ответить
                • > хотя конечно когда я впервые увидел new Integer[-(-128) + 127 + 1];
                  > тоже просмеялся.

                  Артефакты. В Sun JDK в этом месте переменные. В OpenJDK решили, что достаточно констант по умолчанию (и верно решили).
                  Ответить
              • > ДЕВОВ
                старых?
                Ответить
    • Про кеш Integer никогда не слышали? ;)
      Ответить
    • http://www.owasp.org/index.php/Java_gotchas#Immutable_Objects_.2F_Wrapp er_Class_Caching
      Ответить
    • вот кто ИТТ автоголосовалку зла тестил, а? признавайтесь.
      Ответить
      • Смотрите выше. У одного из участников спора нет ни одного минуса. Только тихо! Это рабочая гипотеза.
        Ответить
        • скандалы, интриги, расследования
          Ответить
        • Палево Professional
          javascript:alert($('span.comment-vote strong').each(function(n){var s=document.createElement('span'),a=/^(\d+) за и (\d+) против$/g.exec(this.title);s.innerHTML=(a[1].fontcolor('green')+'/'+a[2].fontcolor('red')).sup();this.appendChild(s)}))
          Ответить
        • Если про меня, то это не я.
          Я сам попадал под эти минусы не раз.
          Ответить
          • Верю. Была у меня и другая мысль, что это был не букмарклет, а кто-то вручную проминусовал. Комментариев здесь немного.
            Ответить

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