Как искать все методы в проекте, которые возвращают реализацию интерфейса коллекции?

Я читал "эффективное Java 2nd Edition" Джоша Блоха. Пункт 43 гласит: "возвращать пустые массивы или коллекции, а не нули". Мой вопрос в том, как я могу искать все методы в проекте, которые возвращают реализацию java.утиль.Интерфейс коллекции? IDE, которая используется, - это Eclipse, но любой способ найти правильный результат приемлем, например regex или какая-либо другая IDE.

8 ответов


нашел это в справке Eclipse:

поиск методов с определенным типом возврата, используйте "* " следующим образом:

  1. откройте диалоговое окно поиска и нажмите вкладка Поиск Java.
  2. тип '*' и тип возвращаемого значения, разделенные пробел в строке поиска.
  3. выберите флажок с учетом регистра.
  4. выберите Метод и объявления, а затем щелкнуть поиск.

Он может помочь найти все методы, которые возвращают конкретные типы, но не реализации некоторых интерфейсов.


Спасибо за упоминание SemmleCode. Чтобы найти все методы в источнике, которые возвращают подтип java.утиль.Коллекция, вы пишете:

import default

class CollectionType extends RefType {
  CollectionType() {
    this.getASupertype*().hasQualifiedName("java.util","Collection")
  }
}

from Method m
where m.getType() instanceof CollectionType
      and
      m.fromSource()
select m

то есть сначала мы определяем, что мы подразумеваем под CollectionType: все типы, которые имеют java.утиль.Коллекция как супертип. За getASupertype есть звезда, потому что мы хотим применить эту операцию ноль или более раз. Затем мы просто выбираем те методы, тип возврата которых является таким CollectionType и которые происходят в источник.

продолжайте, попробуйте: -) это простое упражнение для дальнейшего уточнения запроса к тем методам, которые должны возвращать CollectionType, но могут возвращать null. Все это можно сделать в интерактивном режиме, с автоматическим завершением при разработке запроса и непрерывной проверкой, чтобы помочь вам получить его правильно. Вы можете просматривать результаты по-разному и легко перемещаться между результатами анализа и кодом.

- Oege [раскрытие информации: Я генеральный директор Semmle]


в IntelliJ IDEA вызовите структурный Поиск, выберите существующий шаблон "методы класса". Действие добавит следующий шаблон:

class $Class$ { 
  $ReturnType$ $MethodName$($ParameterType$ $Parameter$);
}

установить текстовое ограничение для переменной" ReturnType " (действие редактировать переменные), чтобы быть java.утиль.Коллекция, укажите "применить ограничение в иерархии" для поиска потомков. Для переменной" MethodName " укажите, что она является целью поиска. Что начать поиск, наслаждайтесь:)


Я не знаю, как найти все методы, тип возврата которых любой произвольная реализация java.утиль.Коллекции (включая те, которые вы можете определить сами).

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

  1. перейдите в любой класс, который импортирует java.утиль.Коллекция, дважды щелкните "коллекция", щелкните правой кнопкой мыши "коллекция" и выберите " ссылки > Проект."

  2. дополнительно для любого особенности тип сбора процентов.

  3. перейдите к любому методу, возвращающему тип коллекции, дважды щелкните его тип возврата и выполните поиск этого типа, как указано выше.

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

для всего вышеизложенного представление "поиск" покажет вам расширяемый контур мест в проекте, где происходит выбранный элемент. Вы можете пересечь этот контур (используя клавиатуру -- с enter для выбора -- или мышь -- щелчок для выбора), чтобы изучить места, которые они используют. Я не вижу способа ограничить просмотренные ссылки на "тип возврата метода", но, по крайней мере, вы сможете быстро перейти к соответствующим местам в коде, чтобы глазное яблоко для специфического типа использования интереса.

(со всем этим вы можете нажать на маленький треугольник вниз в верхней части вкладки "поиск" и отфильтровать тип использования, который будет включен в дисплей, например, исключая операторы импорта.)


время плагин! Я сделал кое-что, что делает большую часть работы...

схватила

http://javadude.com/misc/collectionmarker.zip

http://javadude.com/misc/collectionmarker-source.zip (Если интересно)

распаковать collectionmarker.zip в ваш eclipse dir (ваш eclipse dir должен содержать плагин dir)

перезапустить eclipse

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

этот плагин ищет все в вашей рабочей области; он игнорирует выбор. (Это быстро и грязно)

надеюсь, что это помогает! -- Скотт!--1-->


Если нет способа сделать это с существующим пользовательским интерфейсом, вы всегда можете использовать отражение для прохождения кода. Это не так много работы, пара вложенных циклов.


intellij IDEA имеет структурные/выражения на основе поиска, поэтому при поиске всех методов, возвращающих коллекцию, вы можете по крайней мере получить что-то близкое.


PMD может проверить это, как может SemmleCode, Если ваша IDE не поддерживает структурный поиск.