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

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


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


Ответы (9)


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

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

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

person cletus    schedule 05.05.2009
comment
Я знаю об этом. В этом конкретном случае у меня есть класс держателя ключей с ключевыми константами, используемыми повсюду - следовательно, ваша проблема не является проблемой, скорее наоборот: D - person Thorbjørn Ravn Andersen; 05.05.2009
comment
Когда возникает вопрос, как мне сделать это с помощью статического импорта, я не думаю, что отказ от использования статического импорта - это ответ, заслуживающий одобрения. - person skaffman; 06.07.2009
comment
Защита людей от благих намерений, но ошибочных целей - это проверенный временем метод ответа на вопросы. - person cletus; 06.07.2009
comment
Я считаю, что это также причина, по которой конструкция Паскаля с не является частью Java. Вы теряете контекст. - person Thorbjørn Ravn Andersen; 08.07.2009
comment
@ Торбьёрн Равн Андерсен: значит ли это, что ты больше не собираешься это менять? Клетус убедил вас? - person Tim Büthe; 21.09.2009
comment
@ Тим, нет, меня не убедили, но все остальные ответы предполагали запуск внешних программ, что хуже ... - person Thorbjørn Ravn Andersen; 15.04.2010
comment
Я не согласен - я считаю, что статический импорт всех констант делает код БОЛЕЕ читабельным. Жертвовать реальной краткостью и удобочитаемостью кода для улучшения распечаток и фрагментов кода - это нелепо. В большинстве случаев имени константы достаточно - если я хочу узнать, откуда она взялась, ее несложно найти с помощью IDE. - person Daniel Alexiuc; 11.02.2011
comment
Просто пытаюсь понять вещи, в которых не было обид ... как это отвечает на фактический вопрос! Вопрос заключался в том, чтобы найти простой способ преобразовать все экземпляры в статический импорт, но это больше связано с принятием решения, что объяснил Клетус. - person Ravisha; 03.03.2011
comment
@Ravisha, принятие не означает, что ответ полностью, точно отвечает на вопрос, но что он был наиболее полезным. Или, по крайней мере, бесполезно :) - person Thorbjørn Ravn Andersen; 14.04.2011
comment
Существует множество свободно используемых библиотек, в которых статический импорт необходим для удобочитаемости (например, Mockito, Hamcrest, Fest). Я использую избранное eclipse, чтобы легко управлять статическим импортом в этих случаях, но способ преобразования всех квалифицированных экземпляров в классе, безусловно, был бы полезен. - person Dave Bower; 11.01.2012

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

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

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

person deterb    schedule 05.05.2009
comment
Если вы импортируете статическое application.KeyHolder. *, А затем нажмите ctrl-shift-O, что преобразует ваш импорт в несколько строк, по 1 для каждой константы, которую вы используете в своем коде. - person Jack; 07.07.2009
comment
На самом деле это настраиваемая опция в eclispe. Вы можете указать количество статических импортов, которое хотите, прежде чем использовать звездообразный импорт. Я думаю, что значение по умолчанию - 8. Я снизил его до 3 для использования. - person Pablojim; 08.07.2009

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

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

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

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

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

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

person Chii    schedule 05.05.2009
comment
И теперь у вас две проблемы ;-) - person Robert Munteanu; 03.07.2009
comment
Отказ от использования инструментов рефакторинга внутри Eclipse означает, что вы игнорируете знания, которыми обладает Eclipse о вашем коде, и работаете только с текстовым представлением исходного кода. Вздох. - person Thorbjørn Ravn Andersen; 08.07.2009
comment
Ну, иногда рефакторинг, который вы хотите сделать, не поддерживается внутри eclipse (хотя я считаю, что этот конкретный вариант использования, который у вас здесь, должен поддерживаться) - person Chii; 08.07.2009

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

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

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

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

person starblue    schedule 06.07.2009

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

person Peter Lawrey    schedule 07.07.2009

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

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

person jqno    schedule 04.07.2009

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

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

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

person user121803    schedule 06.07.2009

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

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

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

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

person rinjan    schedule 19.09.2015
comment
Это не удаляет Foo. из разных мест исходного файла. - person Thorbjørn Ravn Andersen; 19.09.2015
comment
Если Foo - постоянный класс, как насчет замены всех Foo. с empty () и использовать строку выше вверху? - person rinjan; 19.09.2015
comment
Выберите «Правка» - ›« Найти / заменить »или нажмите« Ctrl + F ». Используйте «Foo» в качестве текста для поиска и «» (пустой) в качестве замены текстом, затем нажмите кнопку «Заменить все». Затем в разделе импорта добавьте - импортируйте статический Foo. *. Торбьёрн Равн Андерсен, «Каждая среда IDE поддерживает замену всех функций». Не могу принять твою точку зрения. - person rinjan; 08.06.2016
comment
Выполнение этого на текстовом уровне полностью упускает из виду весь смысл использования IDE. Что, если это единственное, что я хотел бы импортировать из Foo статически? - person Thorbjørn Ravn Andersen; 08.06.2016
comment
Это всего лишь уловка и, возможно, не для компьютерных фанатов. Я думаю, что это поможет вам, когда их буквально тысячи, и вам не нужна другая IDE, кроме eclipse, и когда ваш клиент или начальник ждут, когда вы быстро доставите продукт. Вы знаете контекст лучше, чем я. Так что используйте, только если считаете этот способ полезным. В противном случае просто забудьте об этом. - person rinjan; 09.06.2016
comment
Как говорится в отредактированном вопросе, с тех пор я обнаружил, что IntelliJ может это сделать. Для меня этого достаточно. - person Thorbjørn Ravn Andersen; 09.06.2016
comment
моя вина. Я думал, вы знаете, как это сделать в Intellej, и вам нужен способ сделать это в Eclipse. - person rinjan; 09.06.2016
comment
Извините, что не сформулировал вопрос достаточно четко. Как я мог сформулировать это яснее? - person Thorbjørn Ravn Andersen; 09.06.2016
comment
Думаю, вопрос ясен, но я его неправильно понял. - person rinjan; 09.06.2016

Я не знаю, будет ли это соответствовать вашим потребностям, но вы всегда можете определить эти константы в интерфейсе, а все ваши классы просто реализуют этот интерфейс. Затем, используя некоторые умные 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);
   }
}
person Grzegorz Oledzki    schedule 06.07.2009
comment
это было бы ужасным способом кодирования - не создавайте и не реализуйте интерфейсы только для доступа к статическим конечным константам. - person Chii; 08.07.2009
comment
Я знаю это. Я просто следил за идеей OP. Спасибо, в любом случае. - person Grzegorz Oledzki; 08.07.2009