Jawa / Говнокод #27047 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 Fike, (Updated )

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

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

        чтобы вызывающий код не обязан был пирдолица с твоим чекд исключением
        Ответить
        • И в итоге вызывающий код упадёт, если вдруг оно случится, потому что в «обработчике» тупо throw.
          Ответить
          • обычно когда так заворачивают, то хотят сказать, что код скорее всего никогда не упадет

            Чекнд исключения отличная идея была, к сожалению никто в мире не понял, как ей пользоваться
            Ответить
            • в таких случаях я чаще вижу в кишках catch(Exception ignored) {}

              там даже в том же Files проверка существования узлов в файловой системе как-то так делается
              Ответить
  • > convert Closable to Runnable

    Зачем? Зачем? Чтобы закидывать закрывашку в тредпул?
    Ответить
    • Там эта конвертация нужна для закрытия стримов, у коих close-хэндлеры обязаны иметь тип Runnable. Автор видимо поленился в исходниках посмотреть, где этот метод используется, и сразу побежал кукарекать на гк
      Ответить
      • А что изменилось от наличия close-handler'ов, которые не соответствуют модели своего же языка?
        Ответить
          • в глотании 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().
                    Ответить
                    • Согласен.
                      Закрытие файла должно быть просто уничтожением структуры в памяти ядра и удалением записи в таблице дескрипторов процесса, и никогда не должно падать

                      Пусть бы все делали флаш вручную
                      Ответить
                      • Ну да, все освобождения ресурсов быть void noexcept. Иначе начинается ёбаный цирк.

                        З.Ы. С другой стороны, я и сам могу позвать flush(), а потом забить на ошибку close(). Но гарантий насчёт этого нету.
                        Ответить
                        • так делали многие, потому и завезли closeQuietly в IOUtils

                          Но вообще тут соснули конечно еще и чекды: тебя заставляют давить то, что никогда не может случиться, и давка эта вербозна
                          Ответить
              • Это и есть глотание. Был в сигнатуре, да сплыл. Теперь это рантайм эксепшен, который не надо обрабатывать, потому что это "неправильно написанная программа", а не "диск поебался"
                Ответить
    • Чтобы onClose(), как правильно заметил Рождественская Какашка
      Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8