Подтвердить что ты не робот

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

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

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

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

import static Foo.BAR;

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

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


EDIT: На самом деле, я бы предпочел, чтобы сказать Eclipse, что я хочу, чтобы Ctrl-Shift-M делал свою магию для ВСЕХ экземпляров в этом конкретном классе, а не только для одного экземпляра, на который я располагал курсор. (Это устаревший код, поэтому на самом деле УЛУЧШЕНО читаемость:))


EDIT: Я обнаружил, что IntelliJ предлагает сделать это.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Затем выполните проект, который будет организовывать импорт, и вы все настроены.

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

Ответ 7

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

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

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

Ответ 8

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

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

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

import static Foo. *

Ответ 9

Я не знаю, соответствует ли это вашим потребностям, но вы всегда можете определить эти константы в интерфейсе и все классы просто реализуют этот интерфейс. Затем, используя некоторые умные 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);
   }
}