Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Thorbjørn Ravn AndersenОтветов: 9

Если у меня есть постоянный 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 предлагает это сделать.

  • +1 За простое упоминание Ctrl-Shift-M Robert Munteanu 19.06.2009
  • Кстати: для тех, кто спотыкается здесь: ctrl-shift-m работает именно для этого, поместите курсор на BAR, нажмите его, и у вас есть статический импорт (проверенный в eclipse luna), который еще лучше описан здесь: codeaffine.com/2012/03/28/how-do-you -import-static-in-eclipse Dudelilama 10.04.2015

javaeclipse

Ответы

Ответ 1 · рейтинг 10 · cletus

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

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

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

Ответ 2 · рейтинг 3 · deterb

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

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

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

Ответ 3 · рейтинг 2 · Chii

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

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

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

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

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

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

Ответ 4 · рейтинг 1 · starblue

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

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

Затем организуйте импорт в масштабах проекта, и все готово.

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

Ответ 5 · рейтинг 1 · Peter Lawrey

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

Ответ 6 · jqno

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

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

Ответ 7 · рейтинг -1 · user121803

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

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

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

Ответ 8 · рейтинг -2 · rinjan

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

импортировать статический Foo. *

Ответ 9 · рейтинг -3 · Grzegorz Oledzki

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы