В рамках работы над JSR 335 библиотеки JRE развивались благодаря введению java.util.Stream
и одновременному использованию новой концепции в таких местах, как java.nio
.В течение этого времени группа экспертов по Eclipse консультировалась с группой экспертов JSR 335, чтобы обсудить следующий конфликт :
Инструменты типа ecj хотят сигнализировать, когда программисты забывают закрытьресурс, устойчивый к GC (GCR), такой как, например, FileInputStream
.
. Команда библиотеки планировала сделать java.util.Stream
подтипом AutoCloseable
, чтобы разрешить использование в try-with-resource, мотивированный тем фактом, что j.u.Stream
может потенциально быть поддержан ресурсом GCR.Тем не менее, по умолчанию предполагается, что экземпляры j.u.Stream
do не требуют close()
вызова.
Тем не менее, некоторые методы в java.nio
возвращают j.u.Stream
требует, чтобы было close()
d.
EG и Eclipse согласились, что не может быть найдено простого решения , такого, что просто взглянув на тип закрываемого любой инструмент может точно распознать , необходимо ли закрытие или нет.Это связано с тонкостью различных ресурсов , обертывающих других ресурсов на нескольких уровнях.В частности, тип j.u.Stream
не указывает, поддерживаются ли экземпляры ресурсами GCR или нет.
Для чистого решения было также упомянуто, что система аннотаций типов (использующая JSR 308) будетпонадобиться для обогащения системы типов информацией, необходимой для точного статического анализа.Насколько мне известно, такой подход не был реализован до сегодняшнего дня.
В качестве компромисса разработчикам инструментов, таким как Eclipse, было рекомендовано кодировать эвристику по следующим направлениям:
Обычно все экземпляры типа AutoCloseable
должны быть закрыты.
Следующий известный набор типов должен был быть исключен из анализа, поскольку эти обычно не требуют закрытия: java.util.Stream
и {Int,Long,Double}Stream
.
Как исключение из исключения, некоторые статические методы, возвращающие поток, в java.nio
известны как require закрытие.
Обсуждение в основном происходило между следующими двумя постами в списке рассылки lambda-libs-spec-наблюдателей:
Так многодля истории.
Дискуссия в 2013 году не получилане для пользовательских реализаций из j.u.Stream
.Eclipse не предполагает никаких конкретных знаний об этих реализациях.Было бы лучше, если бы инструмент не решал смещение в сторону необходимости / не необходимости закрытия (), но если бы у разработчика (здесь MyStream
) были бы средства, чтобы указать, требуют ли экземпляры этого класса закрытия или нет.Однако у современных разработчиков нет средств выразить это.
Из-за отсутствия полной и точной опции мы могли бы обсудить расширение набора эвристик, чтобы не только известный набор типов в j.u.Stream
семейство, но также все его подтипы исключены из анализа и считаются GC-дружественными.Очевидно, что такой подход увеличил бы риск ложных негативов (ошибок, пропущенных анализом).
Маркировка предупреждений как "потенциальных утечек", как предполагает ответ Хоулгера, может привести к путанице, потому что в анализе потока слово«Потенциал» обычно должен указывать на поведение, которое происходит в некоторых, но не во всех потоках, проходящих через программу.
На сегодняшний день доступны следующие параметры:
Использование @SuppressWarnings("resource")
везде, где используется MyStream
(предпочтительно)
Понижение серьезности этой конкретной проблемы (если использование MyStream
слишком широко распространено для использования первой опции).