Абсолютно согласен. Вообще никаких цифр… «у нас упало приложение на OOM, значит виноват G1, мы его отключили». и второе, где в статье сравнение с Shenandoah?
В данном случае единственным бескостыльным методом является:
try {
... открывает ресурс ...
} finally {
... правильно закрываем ресурс, если он не null ...
}
Все остальные варианты — это костыли (за исключением обертки, но ее писать не удобно). И @Cleanup — это аннотация, которая помогает сделать более менее красивый костыль. Переменная fake и использование передачи метода, чтобы только закрыть ресурс — она просто ужасна:
Resource res; // вот тут она объявляется только потому, что внутри try ее не объявить - это жесть №1
try (Autoclose fake = (res = ResourceCreator.create())::free) { // все, fakе больше нигде не используется, это жесть №2
... тут уже полезный код ...
}
Я же не говорю, что давайте использовать @Cleanup везде, нет. Если метод маленький и там один такой ресурс с free, то не беда, давайте просто try-finally сделаем. Но когда идет работа с потоками, один вкладывается в другой, разные врайтеры, которые не закрывают ресурсы, когда закрываются сами, и если их много, то почему нет? Имхо одна строчка
Дебажить — поставить два бряка, один на код, второй на метод free. Зачем дебажить то, что происходит внутри finally? Я все-таки надеюсь, что люди, пишущие Lombok умные, и сделали там все правильно.
Ужасного там то, что он работает только на Java 8, а также то, что появляется какая-то магическая переменная fake, которая используется только для того, чтобы выполнить код очистки ресурсов, и вот это как раз-таки на первый взгляд не очевидно
да, все верно, опечатка, конечно же вернется "def"
вот если его убрать, то все ок будет.
Все остальные варианты — это костыли (за исключением обертки, но ее писать не удобно). И @Cleanup — это аннотация, которая помогает сделать более менее красивый костыль. Переменная fake и использование передачи метода, чтобы только закрыть ресурс — она просто ужасна:
Я же не говорю, что давайте использовать @Cleanup везде, нет. Если метод маленький и там один такой ресурс с free, то не беда, давайте просто try-finally сделаем. Но когда идет работа с потоками, один вкладывается в другой, разные врайтеры, которые не закрывают ресурсы, когда закрываются сами, и если их много, то почему нет? Имхо одна строчка
куда понятнее и более читаемая.