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

    +72

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    public class Test {
        public static final int a;
        static {
            System.out.println(Main.a);
            a = 42;
            System.out.println(Main.a);
        }
    }

    javac такой javac...

    Так видит проблему: http://ideone.com/jhPN5X
    А вот так - нет: http://ideone.com/qAMIvH

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

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

    • Блин, в коде опечатка, а отредактировать его уже нельзя. В одном месте переименовал Main в Test, во втором забыл. На ideone код правильный.
      Ответить
      • Хуйню написал.
        Ответить
        • Говно в том, что компилятор не понял, что тут прочитали final переменную до ее инициализации. А так - да, там будет 0, 0.0, 0.0f, false или null в зависимости от типа.
          Ответить
          • Мне нравится жабовский минимализм, но возможно правильней сделали в C#, где 2 ключевых слова.
            readonly == final
            const == static final. и никаких заданий в статическом конструкторе.
            static const == static final с присваиванием в статическом конструкторе.
            http://ideone.com/af2eI3
            Ответить
    • Во говнище.
      Ну и кстати.
      public static final int b;
      static {
           Test.b=0;//error
            b=0;//compile
      Ответить
      • Кстати родился этот пример из примера с циклической зависимостью статиков. Я думал, что если один класс юзает статики из второго, а второй в свою очередь трогает статики в первом, то жабомашина выдаст какое-нибудь CircularDependencyError, заметив обращение к не до конца инициализированному классу... А вот и хуй, просто видит обнуленный статик.

        https://ideone.com/MpvQLs
        Ответить
        • а шарпик ругается http://ideone.com/3GoGGR
          Ответить
          • Та неужели? Это специфика const.
            http://ideone.com/q2G1mw
            Пример борманда неявно превращается в код, который исполнится в статическом конструкторе.
            const это запрещает.
            Ответить
            • Ну, т.е. в жабе аналогов шарпового const нет? Применимо к данному контексту.
              Ответить
              • http://govnokod.ru/12588#comment169613
                Я тут пояснил. Только с очепяткой
                static readonly == static final.
                По сути const == static final, только с явным вычислением в compile-time.
                Потому и присваивание в статическом конструкторе запрещено.
                И так как в коде main() задан порядок обращений к классам - сначала взять из Test1, который берет 42 из Test2, итд то можно разрулить цикл и сделать вычисление.
                А вот при компиляции явно заданного порядка нет. Посему разрешить цикл не представляется возможным.
                Ответить
    • Почитайте Java Puzzlers, там и не такие разрывы шаблона встречаются. :)
      Ответить
      • Спасибо, добавил в очередь, когда-нибудь доберусь.
        Ответить
        • под каким номером встало?
          Ответить
          • Под номером 3. В очереди болтались FAQ Анжелики Лагнер о дженериках (о котором 3.14159265 сегодня упомянул в соседнем треде) и Java Concurrency in Practice.
            Ответить
            • В точности.
              EJ, JCP и FAQ по женерикам (там на сайте лежит pdf, и она вполне могла бы продавать свой труд как книгу) - это именно те три необходимые и достаточные книжки, которые нужно прочитать жаба-кодеру.
              Ну а Puzzlers - развлекуха, примерно как говнокод читать. Он во-многом повторяет и дополняет EJ.
              Ответить

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