Как найти все методы в проекте, которые возвращают реализацию интерфейса Collection? - PullRequest
7 голосов
/ 25 февраля 2009

Я читал «Effective Java 2nd Edition» Джоша Блоха. Пункт 43 гласит: «Возвращать пустые массивы или коллекции, а не нули». У меня вопрос, как я могу найти все методы в проекте, которые возвращают реализацию интерфейса java.util.Collection? IDE, которая используется, является Eclipse, но любой способ найти правильный результат приемлем, например, регулярное выражение или какой-либо другой IDE.

Ответы [ 8 ]

10 голосов
/ 13 апреля 2009

Найдено в справке Eclipse:

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

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

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

5 голосов
/ 18 апреля 2009

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

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.util.Collection в качестве супертипа. За getASupertype стоит звезда, потому что мы хотим применить эту операцию ноль или более раз. Далее мы просто выбираем те методы, чей тип возвращаемого значения такой как CollectionType и которые встречаются в источнике.

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

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

4 голосов
/ 11 июня 2009

В IntelliJ IDEA вызовите Structural Search, выберите существующий шаблон «методы класса». Акция добавит следующий шаблон:

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

Установите текстовое ограничение для переменной «ReturnType» (действие «Изменить переменные») равным java.util.Collection, укажите «Применить ограничение в иерархии» для поиска потомков. Для переменной «MethodName» укажите, что она является целью поиска. Вот и начинай искать, наслаждайся:)

1 голос
/ 25 февраля 2009

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

Grab

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

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

Распакуйте файл collectionmarker.zip в каталог dl eclipse (каталог dl eclipse должен содержать каталог plugins)

Перезапустить затмение

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

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

Надеюсь, это поможет! - Скотт

1 голос
/ 25 февраля 2009

Я не знаю, как найти все методы с типом возвращаемого значения any произвольной реализацией java.util.Collection (включая те, которые вы можете определить сами).

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

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

  2. Аналогично для любого конкретного интересующего типа коллекции.

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

  4. Перейдите к любому классу, который импортирует любой файл java.util. что угодно , перетащите курсор через «java.util». без класса, следующего за префиксом пакета , и щелчок правой кнопкой мыши для поиска ссылок на проекты, как указано выше.

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

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

0 голосов
/ 13 апреля 2009

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

0 голосов
/ 25 февраля 2009

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

0 голосов
/ 25 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...