Простой способ создания статического импорта для констант в существующем коде? - PullRequest
37 голосов
/ 05 мая 2009

Если у меня есть постоянный BAR в Foo, который я буду использовать в классе C, мне придется написать

Object o = Foo.BAR + "...";

, который я могу использовать Ctrl-Shift-M в Eclipse (с курсором на BAR), чтобы создать статический импорт для:

import static Foo.BAR;

Object o = BAR + "....";

В настоящее время я обновляю устаревший код, используя тысячи таких букв, которые я хотел бы преобразовать в статический импорт. Ctrl-Shift-O / Упорядочить импорт не делает этого. Есть трюк, который я пропустил?


РЕДАКТИРОВАТЬ: На самом деле, я бы хотел сказать Eclipse, что я хочу, чтобы Ctrl-Shift-M выполнял свою магию для ВСЕХ экземпляров в этом конкретном классе, а не только для одного экземпляра, на котором я поместил курсор. (Это устаревший код, так что это на самом деле улучшает читабельность :))


РЕДАКТИРОВАТЬ: Я обнаружил, что IntelliJ предлагает сделать это.

Ответы [ 9 ]

11 голосов
/ 05 мая 2009

Одно предостережение: чрезмерное использование статического импорта может фактически сделать ваш код менее читаемым (imho), особенно если имя константы не ясно указывает класс или перечисление, к которому он принадлежит. Вы также можете получить имена констант из разных классов / перечислений, которые звучат одинаково или даже имеют одинаковые имена.

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

Честно говоря, я очень редко использую статический импорт по этим причинам.

3 голосов
/ 05 мая 2009

Я не знаю каких-либо других автоматических рефакторингов, чтобы делать то, что вы ищете, но есть два ключевых аспекта: один - добавление импорта, а другой - удаление имени класса из констант. *

Для добавления импорта я рекомендую вставлять import static application.KeyHolder.*; после пакета в каждый файл, который их использует.

Чтобы удалить имя класса, в eclipse выполните поиск Java для KeyHolder.* и найдите поле. Затем вы можете найти / заменить «KeyHolder». и заменить на "". Во избежание несоответствий убедитесь, что количество замененных элементов равно количеству совпадений для этого файла. Кроме того, убедитесь, что вы выполняете поиск вниз и начинаете после импорта.

2 голосов
/ 05 мая 2009

Регулярное выражение было изобретено для решения подобных проблем! =) * * Тысяча одна

вам нужно будет написать небольшой скрипт (или использовать поиск / замену в регулярном выражении IDE). Единственная проблема состоит в том, что если есть много классов, которые должны быть статически импортированы, то это так же много работы. В противном случае, если это всего лишь один класс, например, FOO.BLAH, вы можете использовать регулярное выражение, например

(\bFOO\.(\w+)\b) -> заменить на группу 2 ($ 2 или \ 2, или же ваш искатель регулярных выражений действительно захватывает заменяет).

Вы можете попробовать это здесь: http://www.gskinner.com/RegExr/. Выберите вкладку замены и введите $ 2

Проблема может возникнуть, если у вас есть такие выражения: FOO f = FOO.blah + "FOO.blah", так что следите за этим.

Что касается оператора импорта в верхней части файла, в eclipse есть функция автоматического импорта, которая выполняет автоимпорт в формате и работает, пока имя импорта достаточно уникально. Или, если вы не можете использовать его из-за слишком распространенного имени, вы можете просто использовать сценарий Perl, чтобы вместо этого выполнить регулярное выражение и добавить статический импорт.

1 голос
/ 07 июля 2009

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

0 голосов
/ 19 сентября 2015

Убедитесь, что нет конфликтов с другими константными классами

заменить все "Фу". с пустым ("")

используйте эту строку вверху. работал на меня

импорт статических Foo. *

0 голосов
/ 07 июля 2009

Я не знаю, соответствует ли это вашим потребностям, но вы всегда можете определить эти константы в интерфейсе, и все ваши классы просто реализуют этот интерфейс. Затем, используя некоторые умные RegExp, как другие предполагают, вы можете избавиться от всех Foo. происшествий.

Пример:

public interface Foo {
   static final String constant1 = "Some";
   static final String constant2 = "Value";
   //...
}

А потом

public class YourClass implements Foo {
   public YourClass() {
      System.out.println("Hello " + constant1);
   }
}
0 голосов
/ 06 июля 2009

Eclipse может выполнять глобальный поиск и заменять регулярные выражения по всем файлам в проекте.

Чтобы добавить статический импорт в начало всех файлов, вы можете заменить объявление пакета отдельно и статический импорт.

Затем выполните импорт проекта по всему проекту, и все готово.

Будьте осторожны, однако, это также может привести к большому беспорядку, если вы сделаете это неправильно.

0 голосов
/ 06 июля 2009

Ну, кое-что, что появляется в качестве решения. Я бы порекомендовал использовать простой Groovy скрипт. По сути, семантика связана с анализом операторов импорта и файлов, на которые они ссылаются. Некоторые основные шаги могут быть похожи на

  1. Рекурсировать каждый файл в каталоге. Проверьте, имеет ли расширение файла .java
  2. Соответствует любой строке, которая начинается с импорта
  3. Для каждой такой строки откройте соответствующий исходный файл (вы уже знаете путь из оператора импорта).
  4. Соответствует объявлению поля / метода для статического модификатора с использованием отражения
  5. Добавить статическое после оператора импорта совпадений, найденных на шаге 5.

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

0 голосов
/ 04 июля 2009

Если бы я столкнулся с таким вызовом, я, вероятно, написал бы небольшую программу, чтобы сделать это для меня. Ruby и Python (JRuby и Jython?) Очень хорошо подходят для этой задачи, хотя вы можете сделать это и на Java.

ОК, так что это, вероятно, займет у вас, по крайней мере, столько же времени, сколько вы делаете это вручную, но, по крайней мере, вам будет весело :)).

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