Как найти все неиспользуемые классы в Intellij Idea?


126

В Intellij Idea есть проверка «Неиспользованное объявление», в которой можно найти весь неиспользуемый код. (см. этот вопрос ) Но я хочу найти все неиспользуемые классы, а не методы, переменные и т. д. Только классы. (в списке 3000 результатов сложно найти только классы). Как я могу это сделать?


Просто запустите осмотр, нажмите правую кнопку и увидите это в списке меню.
Cherry

Это два вопроса - лучше бы как отдельные вопросы. Также serialVersionXXX - плохая идея для большинства проектов.
Software Engineer

Это плохая идея, потому что очень немногие разработчики знают, для чего она нужна, и ею почти всегда злоупотребляют. В Java крайне редко используется механизм сериализации для чтения и записи объектов на байтовом уровне, и если вы это сделаете, серийная версия по умолчанию обычно достаточна для обеспечения безопасности. Жестко закодированная версия serialVersion должна обновляться вручную каждый раз при изменении интерфейса класса и при каждом изменении списка полей - разработчики неизменно этого не делают, потому что они просто не понимают, для чего предназначена serialVersion. Основная причина, по которой вы видите это в коде, - это затмение.
Software Engineer

Ответы:


218
  • Нажмите Ctrl+ Shift+ A(в Mac Command+ Shift+ A)
  • Введите "неиспользованный деклар"
  • Дважды щелкните «Неиспользованная декларация».

Появятся настройки

  • Нажмите на Java / Избыточность декларации / Неиспользованное объявление
  • справа внизу выберите "Настройки редактора на лету"
  • снимите галочки напротив полей, ..., проверьте параметры. Отметьте только Проверочные классы.
  • Нажмите ОК

Настройки закрываются

  • В строке меню нажмите «Анализировать / запустить проверку по имени» (или Ctrl+ Alt+ Shift+ I- в Mac Command+ Option+ Shift+ I).
  • Вставить текст «Неиспользованные объявления»
  • Выберите «Неиспользованная декларация Java | Избыточность декларации».

Поиск начинается

  • Когда закончите, проверьте состояние задания внизу Idea: наслаждайтесь результатами и прекрасным ощущением очистки испорченного кода. :)

Отправив в течение нескольких минут почти одинаковый ответ на несколько вопросов, предположите, что один из них является дубликатом другого. отметьте их как таковые.
Jaap

3
Один из них специально предназначен для использования IntelliJ Idea, другой - для общей Java. Я бы не сказал, что это дублирование.
BlondCode 07

7
Он игнорирует конфигурацию «Только проверять классы», поэтому я получаю много-много нежелательных результатов (неиспользуемые методы, поля и т.д., и, что еще хуже, многие из них являются ложными срабатываниями по нескольким причинам ...).
thelawnmowerman 05

6
В Studio 3.0 есть изменение.
Параметр

4
Нам не нужно менять глобальные настройки, чтобы запустить проверку с другими параметрами. Действие «Выполнить проверку по имени» отобразит параметры проверки.
TWiStErRob 05

11

Я не думаю, что это выполнимо. Я подозреваю, что эта функция намеренно исключена из IDE, потому что ее нельзя безопасно использовать, как другие рефакторинги «удалить неиспользуемые XXX».

Неиспользуемые объявления, которые ищет IDEA (и AFAIK, NetBeans), предназначены для частных членов и локальных переменных: вещей, которые недоступны, даже динамически, извне этого класса или области. (Ну, по крайней мере, не делая с Reflection или взломом JVM того, что вам не нужно.) Независимо от того, что внешний код делает с вашей библиотекой, это не приведет к использованию этих вещей, потому что их область действия ограничена, а IDE может все это увидеть. Компилятор может определить это, посмотрев только на ваш код.

Для классов, даже если у них нет publicдоступа, на них можно ссылаться динамически Class.forName(), и это действительно происходит в живом коде. Таким образом, даже если они явно не используются в коде вашего проекта, они могут использоваться в зависимости от того, что запускаете вы или внешний код, использующий вашу библиотеку. Таким образом, IDE не может гарантировать, что удаление этих классов не изменит наблюдаемого извне поведения.

Вот почему я думаю, что IDEA просто не обеспечивает такого поведения: это может дать пользователям ложные ожидания в отношении безопасности, и их удаление не является безопасным рефакторингом.


6
Что ж, он выделяет имя класса серым цветом при фактическом просмотре файла и дает вам намерение «удалить неиспользуемый класс», все, что не хватает, - это возможность автоматически найти их. Конечно, есть способы, которые могут что-то сломать, но это верно для многих рефакторингов.
Роб Флетчер,

2
Class.forName (), возможно, ничем не отличается с точки зрения безопасности анализа от использования отражения для чтения / установки частных полей в классе. Поэтому, если IntelliJ сделает это для полей, это неприемлемый ответ, почему он не будет делать этого и для классов. В любом случае результат анализа не может быть гарантирован на 100%.
Dogs

1

Возможно, вам стоит заглянуть в Unused Symbolосмотр со следующими настройками:

введите описание изображения здесь


Ха! Кажется, нет :-) Я отключил все в группе «неиспользованное объявление» и оставил только «Неиспользуемый символ» с только «проверочными классами». Но результаты не меняются. :-(
Cherry

@Cherry, жаль слышать ... Может быть, тебе стоит сообщить о дефекте в jetbrains
Вик

1

Я не уверен, что это ответит на ваш вопрос, но в прошлом я использовал инструмент Fortify для выполнения правил проверки кода в проекте, которые точно указывают на неиспользуемый импорт, мертвый код, неиспользуемые классы и т. Д. Это платное программное обеспечение, но я Я уверен, что для этого будут доступны некоторые бесплатные плагины / программное обеспечение.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.