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

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    package java.nio.file;
    
    public final class Files {
        /**
         * Convert a Closeable to a Runnable by converting checked IOException
         * to UncheckedIOException
         */
        private static Runnable asUncheckedRunnable(Closeable c) {
            return () -> {
                try {
                    c.close();
                } catch (IOException e) {
                    throw new UncheckedIOException(e);
                }
            };
        }
    }

    стандартные потрошки джавы это какая-то запредельная протомразь, нарушающая собственные законы физики и запрещающая делать это другим

    Запостил: Fike, 21 Октября 2020

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

    • Что все эти строки делают? Особенно интересует это:
      return () ->
      Ответить
    • показать все, что скрытоvanished
      Ответить
      • А в чём суть? Конвертируем чекед в анчекед, чтобы вызывающий код не обязательно было оборачивать в try...catch, а поскольку чекед мы должны где-то обработать, прячем этот try...catch в кишки класса?
        Ответить
    • > convert Closable to Runnable

      Зачем? Зачем? Чтобы закидывать закрывашку в тредпул?
      Ответить
      • Там эта конвертация нужна для закрытия стримов, у коих close-хэндлеры обязаны иметь тип Runnable. Автор видимо поленился в исходниках посмотреть, где этот метод используется, и сразу побежал кукарекать на гк
        Ответить
        • А что изменилось от наличия close-handler'ов, которые не соответствуют модели своего же языка?
          Ответить
          • В чем несоответствие?
            Ответить
            • показать все, что скрытоvanished
              Ответить
            • в глотании IOException, который изначально предназначен для обработки.

              если закрывающий хендлер работает с ИО, но ему запрещено кидать ИОЭкцепцен - это хуевый апи.

              тем более что можно в любой другой эксепшен напихать suppressed, если мы волнуемся за то, что закрыть его надо потому что операция провалилась из-за какого-то другого исключения
              Ответить
              • Где ты увидел глотание IOException? Оно заворачивается в unchecked exception и летит выше точно так же как оригинальный checked, и точно так же может быть обработано. Данный метод конечно является костылём, но он служит вполне конкретной цели -- чтобы обойти ограничение на checked exceptions в сигнатуре метода close. `public void close() throws IOException;`
                Ответить
                • Такой метод нельзя использовать в Runnable напрямую, нужно оборачивать в try/catch, чтобы в onClose был метод без всяких throws IOException в сигнатуре. Иначе ошибка компиляции.

                  Согласен, что это тянется из ванильной джавы и ее ебанутого дизайна исключений, но конкретно этот код не говно
                  Ответить
                • К слову, в другом месте джава этот IOError из close() таки молча жрала. И из-за этого при нехватке места на диске можно успешно получить запоротый файл. Я где-то эту багу постил тут.

                  А всё из-за того, что нарушили SRP и смешали flush и close в одной функции.
                  Ответить
                  • их просто на собесе не спрашивали про солид
                    Ответить
                    • Да это ещё с сишки и юниксов тянется.

                      Типа программистам удобно что последний кусок автоматически флашится при закрытии, а не проёбывается. А на самом деле кучу гемора создали. Легче было бы flush() звать в успешной ветке, чем думать как же обработать ошибку от close().
                      Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • Не, прям какой-то из встроенных стримов жрал.
                      Ответить
                    • https://govnokod.ru/14254

                      И это реальный залёт на разрушение данных.
                      Ответить
                • Это и есть глотание. Был в сигнатуре, да сплыл. Теперь это рантайм эксепшен, который не надо обрабатывать, потому что это "неправильно написанная программа", а не "диск поебался"
                  Ответить
      • показать все, что скрытоvanished
        Ответить

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