Use this dialog to rename a variable.
In addition to renaming the variable itself, IntelliJ IDEA can also look for the usages of the variable name. If found, the changes you are making to the variable name can also be applied to these usages.
The usages are assigned to different categories which correspond to the options which you can turn on and off.
You can set up a scope for usages of a class where the renaming method is located. For example, it might be helpful if you want to rename some popular method such as getSomething
. Instead of searching through the whole project and deciding what to rename or what to leave unchanged along the way, you can limit your search to just one file, or just open files, or the recently changed files, and so on.
Item |
Description |
---|---|
Rename <variable> and its usages to |
Specify a new name for the variable. |
Search for references |
If this option is on, IntelliJ IDEA will look for occurrences of the variable name in variable references in source code files. Whether or not a string literal is a reference is defined by the (programming) language used in a source file. |
Search in comments and strings |
If this checkbox is selected, IntelliJ IDEA will look for occurrences of the variable name within comments and string literals in your source code files. |
Search in loaded sources |
If this checkbox is selected, IntelliJ IDEA will look for occurrences of the variable name within downloaded object sources. |
SQL Script |
The statement to be run to rename the table or column. If necessary, you can edit the statement right in this pane. |
Refactor |
Execute the statement and make associated changes right away. |
Preview |
Preview potential associated changes prior to executing the statement. |
Search for text occurrences |
If this option is on, IntelliJ IDEA will look for occurrences of the variable name in the files that don’t contain source code. These may be the text files, properties files, HTML files, documentation files, and so on. |
Rename variables |
If this option is on, IntelliJ IDEA will look for occurrences of the variable name in the names of variables. Note that only the variables that have the type of the variable you are renaming will be taken into account. To illustrate, let’s assume that you are renaming the class |
Rename inheritors |
If this option is on, IntelliJ IDEA will look for occurrences of the variable name in the names of its inheritors:
|
Rename tests |
If this option is on, IntelliJ IDEA will look for occurrences of the class name in the names of the test classes. |
Rename bound forms |
This option is available if the class you are renaming has an associated GUI form. Select this checkbox to rename the associated form. |
Scope |
Use this option to set a scope for the Rename refactoring. For example, you can limit the refactoring to only recently changed files, or to only open files, and so on. You can also create a custom scope that you can either share or keep local. |
Last modified: 17 January 2023
Как ранее уже сообщалось, я начал активно изучать возможности IntelliJ IDEA. В частности, я стараюсь запомнить наиболее востребованные хоткеи, чтобы выполнять большую часть работы, не отрывая руки от клавиатуры, как это происходит при программировании в Vim. По моим наблюдениям, это реально экономит кучу времени. Я сделал для себя шпаргалку по хоткеям IDEA, которую вы найдете под катом. Полагаю, она также пригодится кому-то из посетителей данного блога.
Примечание: Те же сочетания клавиш работают и в других продуктах JetBrains, например, PyCharm и CLion.
Ниже не приводятся общеизвестные и очевидные сочетания вроде Ctr+C, Ctr+V или Ctr + S. В IntelliJ IDEA многие хоткеи имеют парный хоткей отличающийся только тем, что в нем дополнительно участвует клавиша Shift. Обычно она добавляет в том или ином виде выделение текста. Например, Ctr + End переводит курсор в конец файла, а Ctr + Shift + End выделяет код от текущей позиции до конца файла. Догадаться о существовании парных хоткеев несложно, поэтому далее они не приводятся. Наконец, если в любом диалоге IntelliJ IDEA вы видите подчернутые буквы, знайте, что сочетание Alt + буква равносильно использованию соответствующего контрола (обычно кнопок). Например, быстро запушить код в репозиторий можно путем нажатия Ctr + K, Alt + I, Alt + P, а затем снова Alt + P.
Итак, основные сочетания следующие.
Редактирование:
Ctr + Z | Undo, отменить последнее действие |
Ctr + Shift + Z | Redo, отменить последнюю отмену действия |
Ctr + Shift + V | Расширенная вставка из буфера обмена (с историей) |
Ctr (+ Shift) + W | Инкрементальное выделение выражения |
Ctr + влево/вправо | Перемещение между словами |
Ctr + вверх/вниз | Прокрутка кода без изменения позиции курсора |
Ctr + Home/End | Переход в начало/конец файла |
Shift + Del (Ctr + Y) | Удаление строки, отличие в том, где потом окажется курсор |
Ctr + Del | Удалить от текущей позиции до конца слова |
Ctr + Backspace | Удалить от текущей позиции до начала слова |
Ctr + D | Дублировать текущую строку |
Tab / Shift + Tab | Увеличить / уменьшить текущий отступ |
Ctr + Alt + I | Выравнивание отступов в коде |
Ctr + Alt + L | Приведение кода в соответствие code style |
Ctr + / | Закомментировать/раскомментировать текущую строку |
Ctr + Shift + / | Закомментировать/раскомментировать выделенный код |
Ctr + -/+ | Фолдинг, свернуть/развернуть |
Ctr + Shift + -/+ | Фолдинг, свернуть/развернуть все |
Ctr + Shift + . | Сделать текущий скоуп сворачиваемым и свернуть его |
Ctr + . | Сделать текущий скоуп несворачиваемым |
Ctr + R | Замена в тексте |
Ctr + Shift + R | Замена во всех файлах |
Окна, вкладки:
Alt + влево/вправо | Перемещение между вкладками |
Ctr + F4 | Закрыть вкладку |
Alt + циферка | Открытие/закрытие окон Project, Structure, Changes и тд |
Ctr + Tab | Switcher, переключение между вкладками и окнами |
Shift + Esc | Закрыть активное окно |
F12 | Открыть последнее закрытое окно |
Ctr + колесико | Zoom, если он был вами настроен |
Закладки:
F11 | Поставить или снять закладку |
Ctr + F11 | Аналогично с присвоением буквы или цифры |
Shift + F11 | Переход к закладке (удаление — клавишей Delete) |
Ctr + Число | Быстрый переход к закладке с присвоенным числом |
Подсказки и документация:
Ctr + Q | Документация к тому, на чем сейчас курсор |
Ctr + Shift + I | Показать реализацию метода или класса |
Alt + Q | Отобразить имя класса или метода, в котором мы находимся |
Ctr + P | Подсказка по аргументам метода |
Ctr + F1 | Показать описание ошибки или варнинга |
Alt + Enter | Показать, что нам предлагают «лампочки» |
Поиск:
Дважды Shift | Быстрый поиск по всему проекту |
Ctr + Shift + A | Быстрый поиск по настройкам, действиям и тд |
Alt + вниз/вверх | Перейти к следующему/предыдущему методу |
Ctr + [ и Ctr + ] | Перемещение к началу и концу текущего скоупа |
Ctr + F | Поиск в файле |
Ctr + Shift + F | Поиск по всем файлам (переход — F4) |
Ctr + F3 | Искать слово под курсором |
F3 / Shift + F3 | Искать вперед/назад |
Ctr + G | Переход к строке или строке:номеру_символа |
Ctr + F12 | Список методов с переходом к их объявлению |
Ctr + E | Список недавно открытых файлов с переходом к ним |
Ctr + Shift + E | Список недавно измененных файлов с переходом к ним |
Ctr + H | Иерархия наследования текущего класса и переход по ней |
Ctr + Alt + H | Иерархия вызовов выбранного метода |
Ctr + N | Поиска класса по имени и переход к нему |
Ctr + Shift + N | Поиск файла по имени и переход к нему |
Ctr + B | Перейти к объявлению переменной, класса, метода |
Ctr + Alt + B | Перейти к реализации |
Ctr + Shift + B | Определить тип и перейти к его реализации |
Shift + Alt + влево | Перемещение назад по стеку поиска |
Shift + Alt + вправо | Перемещение вперед по стеку поиска |
F2 / Shift + F2 | Переход к следующей / предыдущей ошибке |
Shift + Alt + 7 | Найти все места, где используется метод / переменная |
Ctr + Alt + 7 | Как предыдущий пункт, только во всплывающем окне |
Генерация кода и рефакторинг:
Ctr + Space | Полный автокомплит |
Ctr + Shift + Space | Автокомплит с фильтрацией по подходящему типу |
Alt + / | Простой автокомплит по словам, встречающимся в проекте |
Ctr + I | Реализовать интерфейс |
Ctr + O | Переопределить метод родительского класса |
Ctr + J | Генерация шаблонного кода (обход по итератору и тд) |
Ctr + Alt + J | Обернуть выделенный код в один из шаблонов |
Alt + Insert | Генератор кода — сеттеров, зависимостей в pom.xml и тд |
Shift + F6 | Переименование переменной, класса и тд во всем коде |
Ctr + F6 | Изменение сигнатуры метода во всем коде |
F6 | Перемещение метода, класса или пакета |
F5 | Создать копию класса, файла или каталога |
Shift + F5 | Создать копию класса в том же пакете |
Alt + Delete | Безопасное удаление класса, метода или атрибута |
Ctr + Alt + M | Выделение метода |
Ctr + Alt + V | Выделение переменной |
Ctr + Alt + F | Выделение атрибута |
Ctr + Alt + C | Выделение константы (public final static) |
Ctr + Alt + P | Выделение аргумента метода |
Ctr + Alt + N | Инлайнинг метода, переменной, аргумента или константы |
Ctr + Alt + O | Оптимизация импортов |
Прочее:
Ctr + ~ | Быстрое переключение цветовой схемы, code style и тд |
Alt + F12 | Открыть/закрыть терминал |
F10 | Запустить последнюю запущенную программу или тест |
Shift + F10 | Запустить открытую в редакторе программу или тест |
Shift + Alt + F10 | Запустить что-то из списка того что запускалось раньше |
Ctr + F2 | Остановить программу |
Ctr + Alt + A | Добавить в систему контроля версий |
Ctr + K | Сделать коммит в систему контроля версий |
Ctr + Shift + K | Сделать пуш в систему контроля версий |
Ctr + Shift + P | В Scala-плагине определяет implicit параметры |
Ctr + Shift + Q | В Scala-плагине определяет implicit преобразования |
Понятное дело, в этой шпаргалке названы далеко не все возможности IntelliJ IDEA. Всем заинтересованным лицам я настоятельно рекомендую вот прямо брать и читать ее замечательную документацию, там очень много интересного. Жаль только, что документация не доступна в виде одного большого PDF файла.
Дополнение: В последних версиях IDEA можно использовать несколько курсоров, разместив их либо при помощи комбинации Alt+Shift+ЛКМ, либо вертикальным выделением при помощи клика средней клавишей мыши. Держа на вооружении сочетание Ctr + влево/вправо, осуществляющего переход между словами, а также другие, можно очень удобно редактировать сразу несколько строк кода.
Дополнение: Впечатления от IntelliJ IDEA после года работы с ней
Метки: Разработка.
Эту статью можно рассматривать как краткий обзор c gif-ками по рефакторингам Java-файлов в IDEA для начинающих.
Осторожно, много тяжелых gif-картинок.
«Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” —M. Fowler (1999)
Содержание
Введение
Раздел «Refaсtor»
— Refactor This
— Rename
— Rename File
— Change Signature
— Edit Property Value (без примера)
— Type Migration
— Make Static
— Convert To Instance Method
— Move Classes
— Copy Classes
— Safe Delete
— Extract/Introduce
— — Variable
— — Constant
— — Field
— — Parameter
— — Functional Parameter
— — Functional Variable
— — Parameter Object
— — Method
— — Type Parameter (без примера)
— — Interface
— — Superclass
— — Subquery as CTE (без примера)
— — RSpec ‘let’ (без примера)
— Inline
— Find and Replace Code Duplicate
— Pull Member Up
— Pull Member Down
— Push ITds In
— Use Interface Where Possible
— Replace Inheritance with Delegation
— Remove Middleman
— Wrap Method Return Value
— Encapsulate Field
— Replace Temp with Query
— Replace Constructor with Factory Method
— Replace Constructor with Builder
— Generify
— Migrate
— Lombok и Delombok (без примера)
— Internationalize Список источников
Введение
Цель данной статьи — показать доступные способы рефакторинга для Java-файлов (многие способы будут работать и для других языков). Как использовать эти приемы в реальной жизни показано в замечательном видео Тагира Валеева (ссылка в списке источников).
Думаю, каждый, кто работает в IDEA, знает, что в ней куча способов для рефакторинга кода. И почти уверен, что каждый второй смотрит анонсы новой версии, где красиво показаны новые способы рефакторинга и заглядывал в раздел Refaсtor:
Но не уверен, что все точно знают что и как делают все элементы этого списка, хотя они все детально описаны в справки к idea
В статье представлены фрагменты кода, порядок действий и анимации почти для каждого пункта. Также постарался добавить, где возможно, ссылку на замечательную книгу Refactoring: Improving the Design of Existing Code (Martin Fowler). Чтобы не сильно раздувать трафик пришлось довольно сильно обрезать много gif-картинок, поэтому обязательно смотрите использованный код под катом. Горячие клавиши приведены для Windows/LInux по умолчанию.
Раздел «Refaсtor»
Пойдем сверху вниз по порядку.
Пункт «Refactor This» (Ctrl+Alt+Shift+T)
Данный пункт используется для быстрого доступа к списку доступных способов рефакторинга. Заметьте, список зависит от места, где вы его вызываете. Здесь и далее в коде указывает на место каретки в коде, при вызове.
Пункт «Rename» (Shift+F6)
Позволяет переименовать практически любой идентификатор в коде, будь то переменная или названия класса. Изменения распространяются по всему проекту, в некоторых случаях, включая и комментарии. (У Фаулера переименованию посвящено 2 главы — “Rename Field” и “Rename Variable”)
До
public class Main {
public static void main(String[] args) {
System.out.print("Hello");
invo<caret/>ke(", World");
}
private static void invoke(String text) {
//text
System.out.println(text);
}
}
После
public class Main {
public static void main(String[] args) {
System.out.print("Hello");
newFunctionName(", World");
}
private static void newFunctionName(String text) {
//text
System.out.println(text);
}
}
-
Переименование переменной
До
public class Main {
public static void main(String[] args) {
System.out.print("Hello");
invoke(", World");
}
private static void invoke(String te<caret>xt) {
//text
System.out.println(text);
}
}
После
public class Main {
public static void main(String[] args) {
System.out.print("Hello");
invoke(", World");
}
private static void invoke(String newText) {
//newText
System.out.println(newText);
}
}
-
Переименование вложенного класса
До
public class Main {
public static void main(String[] args) {
System.out.print("Hello");
invoke(", World");
}
private static void invoke(String text) {
//text
System.out.println(text);
throw new MyExc<caret>eption();
}
public static class MyException extends RuntimeException {
}
}
После
public class Main {
public static void main(String[] args) {
System.out.print("Hello");
invoke(", World");
}
private static void invoke(String text) {
//text
System.out.println(text);
throw new NewMyException ();
}
public static class NewMyException extends RuntimeException {
}
}
-
Переименование класса
До
public class Main {
public static void main(String[] args) {
MyS<caret>ervice service = new MyService();
service.service();
}
}
После
public class Main {
public static void main(String[] args) {
NewMyService myService = new NewMyService ();
myService.service();
}
}
-
Переименование пакета
package gen<caret>eral;
public class Main {
public static void main(String[] args) {
NewMyService service = new NewMyService();
service.service();
}
}
После
package org.test.java.src;
public class Main {
public static void main(String[] args) {
NewMyService service = new NewMyService();
service.service();
}
}
Пункт «Rename File»
Переименовывает файл и ссылки на этот файл. В принципе можно вызывать через Shift+F6 если выделен файл. В диалоговом окне можно указать область поиска для переименований (Scope), искать ли ссылки или в комментариях и строчках
До
public class Main {
public static void main(String[] args) throws IOException {
Path path = Paths.get("src/general/TestFile.txt");
String read = Files.readAllLines(path).get(0);
System.out.println(read);
}
}
После
public class Main {
public static void main(String[] args) throws IOException {
Path path = Paths.get("src/general/TestFile2.txt");
String read = Files.readAllLines(path).get(0);
System.out.println(read);
}
}
Пункт «Change Signature» (Ctrl+F6)
У Фаулера этому посвящена глава “Change Function Declaration”. В новой версии IDEA «Change Signature» был немного доработан. Я знаю два пути:
-
первый путь — прямой — изменить сигнатуру метода и вызвать обновление,
-
второй — через диалоговое окно.
Пример для первого способа (через изменения сигнатуры метода)
Изменяем сигнатуру метода. В этот момент слева появляется «R» и в контекстном меню появляется пункт «Update usages to reflect signature change», который позволяет обновить все использования метода.
До
public class ChangeSignature {
public static void main(String[] args) {
invokeMethod("Hello");
invokeMethod("World");
}
private static void invokeMethod(String text) {
System.out.println(text);
}
}
После
public class ChangeSignature {
public static void main(String[] args) {
invokeMethod("Hello", null);
invokeMethod("World", null);
}
private static void invokeMethod(String text, String newType) {
System.out.println(text);
}
}
Пример для второго способа (через диалоговое окно)
В диалоговом окне можно изменить состав переменных, exception, и даже сгенерировать переопределенный метод.
До
public class ChangeSignature {
public static void main(String[] args) {
invokeMethod("Hello");
invokeMethod("World");
}
private static void invokeMethod(String<caret> text) {
System.out.println(text);
}
}
После
public class ChangeSignature {
public static void main(String[] args) {
invokeMethod("Hello");
invokeMethod("World");
}
private static void invokeMethod(String text) {
invokeMethod(text, null);
}
private static void invokeMethod(String text, String newName) {
System.out.println(text);
}
}
Пункт «Edit Property Value» (Alt + F6)
На данный момент (Idea 2020.2) экспериментальная функция и по умолчанию не включена. Включить можно параметром property.value.inplace.editing=true Поэтому примеры не привожу.
Пункт «Type Migration» (Ctrl + Shift + F6)
Позволяет изменить тип переменной, включая сигнатуры методов, возвращаемый тип переменной.
До
public class ChangeSignature {
public static void main(String[] args) {
Inte<caret>ger hello = 1;
print(hello);
}
private static void print(Integer text) {
System.out.println(text);
}
}
После
public class ChangeSignature {
public static void main(String[] args) {
Number hello = 1;
print(hello);
}
private static void print(Number text) {
System.out.println(text);
}
}
Пункт «Make Static» (Ctrl + Shift + F6)
Позволяет сконвертировать метод или внутренний класс в статический. (Противоположность Convert To Instance Method)
До
public class MakeStatic {
public static void main(String[] args) {
MakeStatic makeStatic = new MakeStatic();
makeStatic.sayHello();
}
public void say<caret>Hello() {
System.out.println("Hello, World");
}
}
После
public class MakeStatic {
public static void main(String[] args) {
MakeStatic makeStatic = new MakeStatic();
MakeStatic.sayHello();
}
public static void sayHello() {
System.out.println("Hello, World");
}
}
Пункт «Convert To Instance Method»
Позволяет сконвертировать статический метод в нестатический (противоположность ”Make Static”). При этом можно указать к какому классу будет относится новый метод.
До
public class MakeStatic {
public static void main(String[] args) {
sayHello();
}
public static void sa<caret>yHello() {
System.out.println("Hello, World");
}
}
После
public class MakeStatic {
public static void main(String[] args) {
new MakeStatic().sayHello();
}
public void sayHello() {
System.out.println("Hello, World");
}
}
Пункт «Move Classes» (F6)
В принципе делает, что и написано, перемещает классы.
До
package org.example.test.service;
public class TestService {
<caret>
}
После
package org.example.test;
public class TestService {
}
Пункт «Copy Classes» (F5)
Многие программисты любят копировать файлы, а не начинать с чистого листа. Для этого прекрасно подходит F5. Меняем название на нужноe, указываем пакет и готово.
Пункт «Safe Delete» (Alt+Delete)
По функциональности почти повторяет то, что можно получить через контекстное меню (Alt + Enter), но позволяет удалять чуть больше. Поэтому, я заметил, у многих знакомых любимый способ рефакторинга — F2(следующая ошибка) и Alt + Enter или Alt + Delete. Можно удалять классы, переменные, методы. Перед удалением IDEA выполнит поиск использования удаляемых элементов, и если IDEA найдет, что они где-то используется покажет диалоговое окно Usages Detected. Про удаление неиспользуемого кода у Фаулера есть целая глава — “Remove Dead Code”
До
package org.example.test;
public class MainClass {
public static void main(String[] args) {
start();
}
private static void start() {
String unUsedVariable;
System.out.println("Hello, World!");
}
private static void unUsedMethod() {
}
}
После
<empty>
Пункт «Extract/Introduce»
Следующий блок — Extract/Introduce. Думаю, является одним из самых популярных. Позволяет извлекать разные части программы.
Пункт «Variable» (Ctrl+Alt+V)
Создает новую переменную из выделенного фрагмента. (Этому способу у Фаулера посвящена глава “Extract Variable”).
До
public class ExtractVariable {
public static void main(String[] args) {
sayHello();
}
private static void sayHello() {
System.out.println("He<caret>llo, World!");
}
}
После
public class ExtractVariable {
public static void main(String[] args) {
sayHello();
}
private static void sayHello() {
String text = "Hello, World!";
System.out.println(text);
}
}
Пункт «Constant» (Ctrl+Alt+C)
Создает новую константу из выделенного фрагмента.
До
public class ExtractVariable {
public static void main(String[] args) {
sayHello();
}
private static void sayHello() {
System.out.println("He<caret>llo, World!");
}
}
После
public class ExtractVariable {
public static final String HELLO_WORLD = "Hello, World!";
public static void main(String[] args) {
sayHello();
}
private static void sayHello() {
System.out.println(HELLO_WORLD);
}
}
Пункт «Field» (Ctrl+Alt+F)
Создает новое поле класса из выделенного фрагмента.
До
public class ExtractVariable {
public static void main(String[] args) {
sayHello();
}
private static void sayHello() {
System.out.println("He<caret>llo, World!");
}
}
После
public class ExtractVariable {
private static String x;
public static void main(String[] args) {
sayHello();
}
private static void sayHello() {
x = "Hello, World!";
System.out.println(x);
}
}
Пункт «Parameter» (Ctrl+Alt+P)
Создает новый параметр (функции) из выделенного фрагмента.
До
public class ExtractVariable {
public static void main(String[] args) {
sayHello();
}
private static void sayHello() {
System.out.println("He<caret>llo, World!");
}
}
После
public class ExtractVariable {
public static void main(String[] args) {
sayHello("Hello, World!");
}
private static void sayHello(String x) {
System.out.println(x);
}
}
Пункт «Functional Parameter»
Очень похож на пункт «Parameter», но теперь в функцию мы передаем или java.util.function.Supplier, или javafx.util.Builder. Обратите внимание, данный рефакторинг может привести к нежелательным эффектам.
До
public class ExtractParameter {
public static void main(String[] args) {
System.out.println(generateText());
}
private static String generateText() {
return "Hello, Wor<caret>ld!".toUpperCase();
}
}
После
public class ExtractParameter {
public static void main(String[] args) {
System.out.println(generateText(() -> "Hello, World!"));
}
private static String generateText(final Supplier<string> getText) {
return getText.get().toUpperCase();
}
}
Пункт «Functional Variable»
Очень похож на пункт «Variable», но теперь мы получаем или java.util.function.Supplier или javafx.util.Builder.
До
public class ExtractParameter {
public static void main(String[] args) {
System.out.println(generateText());
}
private static String generateText() {
return "Hello, W<caret>orld!".toUpperCase();
}
}
После
public class ExtractParameter {
public static void main(String[] args) {
System.out.println(generateText());
}
private static String generateText() {
Supplier<string> getText = () -> "Hello, World!";
return getText.get().toUpperCase();
}
}
ParameterObject
Пункт «Parameter Object»
Удобный способ, когда в функцию передается много аргументов и вам надо обернуть их в класс. (У Фаулера это глава “Introduce Parameter Object”).
До
public class ExtractParameter {
public static void main(String[] args) {
System.out.println(generateText("Hello", "World!"));
}
private static String generateText(Str<caret>ing hello, String world) {
return hello.toUpperCase() + world.toUpperCase();
}
}
После
public class ExtractParameter {
public static void main(String[] args) {
System.out.println(generateText(new HelloWorld("Hello", "World!")));
}
private static String generateText(HelloWorld helloWorld) {
return helloWorld.getHello().toUpperCase() + helloWorld.getWorld().toUpperCase();
}
private static class HelloWorld {
private final String hello;
private final String world;
private HelloWorld(String hello, String world) {
this.hello = hello;
this.world = world;
}
public String getHello() {
return hello;
}
public String getWorld() {
return world;
}
}
}
Пункт «Method» (Ctrl+Alt+M)
Извлекаем метод из выделенного фрагмента. (У Фаулера есть глава про похожий способ рефакторинга — “Extract Function”).
До
public class ExtractMethod {
public static void main(String[] args) {
String text = "Hello, World!";
System.out.prin<caret>tln(text);
}
}
После
public class ExtractMethod {
public static void main(String[] args) {
String text = "Hello, World!";
print(text);
}
private static void print(String text) {
System.out.println(text);
}
}
Пункт «Type Parameter»
Рефакторинг из мира Kotlin, и для Java не применим (буду рад добавить, если кто-то сделает пример).
Пункт «Replace Method With Method Object»
Оборачивает выделенный фрагмент в объект. Может использоваться, если надо вернуть несколько объектов из метода (возвращает объект-обертку).
До
public class ExtractMethod {
public static void main(String[] args) {
String text = "Hello, World!";
print(text);
}
private static void print(String text) {
System.out.p<caret>rintln(text);
}
}
После
public class ExtractMethod {
public static void main(String[] args) {
String text = "Hello, World!";
print(text);
}
private static void print(String text) {
new Printer(text).invoke();
}
private static class Printer {
private String text;
public Printer(String text) {
this.text = text;
}
public void invoke() {
System.out.println(text);
}
}
}
Пункт «Delegate»
Позволяет извлечь методы и поля в отдельный класс.
До
public class Delegate {
public static void main(String[] args) {
new Delegate().print();
}
private void print() {
System.ou<caret>t.println("Hello, World!");
}
}
После
public class Delegate {
private final Printer printer = new Printer();
public static void main(String[] args) {
new Delegate().print();
}
private void print() {
printer.print();
}
public static class Printer {
public Printer() {
}
private void print() {
System.out.println("Hello, World!");
}
}
}
Пункт «Interface»
Для заданного класса и его методов создает интерфейс. (Особенно удобно, когда при работе со Spring, когда кто-то забыл для компонента создать соответствующий интерфейс)
До
public class ExtractImpl {
public static void main(String[] args) {
new ExtractImpl().print();
}
public void print() {
System.out.println("Hello, World!");
}
}
После
public class ExtractImpl implements ExtractInterface {
public static void main(String[] args) {
new ExtractImpl().print();
}
@Override
public void print() {
System.out.println("Hello, World!");
}
}
public interface ExtractInterface {
void print();
}
Пункт «Superclass»
Аналогично пункту «Interface», только теперь создается класс-родитель (Superclass). Фаулер описывает этот способ рефакторинга в главе “Extract Superclass”.
До
public class ExtractImpl {
public static void main(String[] args) {
new ExtractImpl().print();
}
public void print() {
System.out.println("Hello, World!");
}
}
После
public class ExtractImpl extends ExtractAbstr {
public static void main(String[] args) {
new ExtractImpl().print();
}
}
public class ExtractAbstr {
public void print() {
System.out.println("Hello, World!");
}
}
Пункт «Subquery as CTE»
Относится к Sql, поэтому пропускаю. Если кто-то пришлет пример, хотя бы в виде кода — с удовольствием дополню.
Пункт «RSpec ‘let’»
Относится к Ruby, поэтому пропускаю Если кто-то пришлет пример, хотя бы в виде кода — с удовольствием дополню.
Пункт «Inline»
Возможно один из самых крутых методов рефакторинга, Инлайнить можно почти все. Фаулер описывает этот способ рефакторинга в главах “Inline Class”, “Inline Function”, “Inline Variable”.
До
public class Inline {
public static void main(String[] args) {
print();
}
private static void print() {
new Printer().print();
}
private static class Printer {
public void print() {
String text = "Hello, World!";
System.out.println(t<caret>ext);
}
}
}
После
public class Inline {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Пункт «Find and Replace code duplicate»
Ищет похожие фрагменты кода и предлагает заменить их, например, вызовом метода или константой.
До
public class Replace {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
public void print() {
System.out.println("Hello, World!");
}
public void print2() {
System.out.prin<caret>tln("Hello, World!");
}
}
После
public class Replace {
public static void main(String[] args) {
print2();
}
public void print() {
print2();
}
public static void print2() {
System.out.println("Hello, World!");
}
}
Пункт «Invert Boolean»
Позволяет инвертировать булевые переменные.
До
public class Invert {
public static void main(String[] args) {
boolean co<caret>ndition = true;
if (condition) {
System.out.println("Hello, World!");
}
}
}
После
public class Invert {
public static void main(String[] args) {
boolean condition = false;
if (!condition) {
System.out.println("Hello, World!");
}
}
}
Пункт «Pull Member Up»
Позволяет перемещать методы или поля по иерархии вверх. Зачем это нужно написано у Фаулера в главах “Pull Up Field” и “Pull Up Method”. Выполняет обратную задачу пункта «Pull Member Down».
До
public class PullMethod {
public static void main(String[] args) {
new InnerClass().print();
}
private static class InnerClass extends AbstClass {
public void print() {
System.out.pri<caret>ntln("Hello, World");
}
}
private static abstract class AbstClass {
}
}
После
public class PullMethod {
public static void main(String[] args) {
new InnerClass().print();
}
private static class InnerClass extends AbstClass {
}
private static abstract class AbstClass {
public void print() {
System.out.println("Hello, World");
}
}
}
Пункт «Pull Member Down»
Выполняет обратную задачу пункта «Pull Member Up». Позволяет перемещать методы или поля по иерархии вниз. (У Фаулера — глава “Push Down Method”)
До
public class PullMethod {
public static void main(String[] args) {
new InnerClass().print();
}
private static class InnerClass extends AbstClass {
}
private static abstract class AbstClass {
public void print() {
System.out.prin<caret>tln("Hello, World");
}
}
}
После
public class PullMethod {
public static void main(String[] args) {
new InnerClass().print();
}
private static class InnerClass extends AbstClass {
@Override
public void print() {
System.out.println("Hello, World");
}
}
private static abstract class AbstClass {
public abstract void print();
}
}
Пункт «Push ITds In»
Используется при работе с AsperctJ.
До
aspect myAspect {
boolean Account.closed = <caret>false;
void Account.close() {
closed = true;
}
}
class Account {
}
После
aspect myAspect {
boolean Account.closed = false;
}
class Account {
void close() {
closed = true;
}
}
Пункт «Use Interface Where Possible»
IDEA старается заменить, где это возможно, указания классов на указание интерфейсов.
До
public class ExtractInterface {
public static void main(String[] args) {
InnerClass innerClass = new InnerClass();
print(innerClass);
}
private static void print(InnerClass innerClass) {
innerClass.print();
}
private static class InnerClass implements InnerInterface{
@Override
public void print() {
System.out.println("Hello, World!");
}
}
private static interface InnerInterface{
void print();
}
}
После
public class ExtractInterface {
public static void main(String[] args) {
InnerInterface innerClass = new InnerClass();
print(innerClass);
}
private static void print(InnerInterface innerClass) {
innerClass.print();
}
private static class InnerClass implements InnerInterface{
@Override
public void print() {
System.out.println("Hello, World!");
}
}
private static interface InnerInterface{
void print();
}
}
Пункт «Replace Inheritance with Delegation»
Заменяет наследование делегированием. У Фаулера про это главы “Replace Subclass with Delegate” и “Replace Superclass with Delegate”.
До
public class InheritanceDelegation {
public static void main(String[] args) {
InnerClass innerClass = new InnerClass();
print(innerClass);
}
private static void print(InnerClass innerClass) {
innerClass.print();
}
private static class In<caret>nerClass extends AbstractClass {
}
private static class AbstractClass {
public void print() {
System.out.println("Hello, World!");
}
}
}
После
public class InheritanceDelegation {
public static void main(String[] args) {
InnerClass innerClass = new InnerClass();
print(innerClass);
}
private static void print(InnerClass innerClass) {
innerClass.print();
}
private static class InnerClass {
private final AbstractClass abstractClass = new AbstractClass();
public void print() {
abstractClass.print();
}
}
private static class AbstractClass {
public void print() {
System.out.println("Hello, World!");
}
}
}
Пункт «Remove Middleman»
Заменяет все делегированные вызовы на прямые. (У Фаулера — глава “Remove Middle Man”).
До
public class Middleman {
public static void main(String[] args) {
InnerClass innerClass = new InnerClass();
innerClass.print();
}
private static class InnerClass {
private final NextClass next<caret>Class = new NextClass();
public void print() {
nextClass.print();
}
}
private static class NextClass {
public void print() {
System.out.println("Hello, World!");
}
}
}
После
public class Middleman {
public static void main(String[] args) {
InnerClass innerClass = new InnerClass();
innerClass.getNextClass().print();
}
private static class InnerClass {
private final NextClass nextClass = new NextClass();
public NextClass getNextClass() {
return nextClass;
}
}
private static class NextClass {
public void print() {
System.out.println("Hello, World!");
}
}
}
Пункт «Wrap Method Return Value»
Оборачивает возвращаемое значение в объект-обертку. Удобно, когда нужно возвращать несколько связанных значений.
До
public class WrapMethodReturnValue {
public static void main(String[] args) {
System.out.println(new MessageFolder().get());
}
private static class MessageFolder {
public String get() {
ret<caret>urn "Hello, World!";
}
}
}
После
public class WrapMethodReturnValue {
public static void main(String[] args) {
System.out.println(new MessageFolder().get().getValue());
}
private static class MessageFolder {
public Message get() {
return new Message("Hello, World!");
}
public class Message {
private final String value;
public Message(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
}
}
Пункт «Encapsulate Field»
Скрывает поле за getter, setter.
До
public class EncapsulateField {
public static void main(String[] args) {
System.out.println(new InnerClass().message);
}
private static class InnerClass {
public String m<caret>essage = "Hello, World!";
}
}
После
public class EncapsulateField {
public static void main(String[] args) {
System.out.println(new InnerClass().getMessage());
}
private static class InnerClass {
private String message = "Hello, World!";
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
}
Пункт «Replace Temp with Query»
Пусть у вас есть
int size = getActualSize()
с помощью этого способа рефакторинга вы можете заменить использование size на использование метода getActualSize(). Это приведет к увеличению количества вызовов методов, но в некоторых случаях может оказаться полезным. Пример так же показывает возможность извлечения метода с одновременным его дальнейшим использованием.
До
public class ReplaceTemp {
public static void main(String[] args) {
String hello = "Hello";
String mes<caret>sage = hello + ", World!";
System.out.println(message);
}
}
После
public class ReplaceTemp {
public static void main(String[] args) {
String hello = "Hello";
System.out.println(message(hello));
}
private static String message(String hello) {
return hello + ", World!";
}
}
Пункт «Replace Constructor with Factory Method»
Генерирует фабричный метод для указанного конструктора. Идеально, если у вас нет Lombok. (У Фаулера этому посвящена глава “Replace Constructor with Factory Function”).
До
public class ReplaceConstructor {
public static void main(String[] args) {
new InnerClass("Hello", "World").print();
}
private static class InnerClass {
private String message;
public Inner<caret>Class(String hello, String world) {
message = hello + ", " + world;
}
public void print() {
System.out.println(message);
}
}
}
После
public class ReplaceConstructor {
public static void main(String[] args) {
InnerClass.createInnerClass("Hello", "World").print();
}
private static class InnerClass {
private String message;
private InnerClass(String hello, String world) {
message = hello + ", " + world;
}
public static InnerClass createInnerClass(String hello, String world) {
return new InnerClass(hello, world);
}
public void print() {
System.out.println(message);
}
}
}
Пункт «Replace Constructor with Builder»
Генерирует builder для указанного конструктора. Идеально, если у вас нет Lombok.
До
public class ReplaceConstructor {
public static void main(String[] args) {
new InnerClass("Hello", "World").print();
}
private static class InnerClass {
private String message;
public InnerC<caret>lass(String hello, String world) {
message = hello + ", " + world;
}
public void print() {
System.out.println(message);
}
}
}
После
public class ReplaceConstructor {
public static void main(String[] args) {
new InnerClassBuilder().setHello("Hello").setWorld("World").createInnerClass().print();
}
static class InnerClass {
private String message;
public InnerClass(String hello, String world) {
message = hello + ", " + world;
}
public void print() {
System.out.println(message);
}
}
}
public class InnerClassBuilder {
private String hello;
private String world;
public InnerClassBuilder setHello(String hello) {
this.hello = hello;
return this;
}
public InnerClassBuilder setWorld(String world) {
this.world = world;
return this;
}
public ReplaceConstructor.InnerClass createInnerClass() {
return new ReplaceConstructor.InnerClass(hello, world);
}
}
Пункт «Generify»
Пытается код с raw-типами превратить в код с Generic-типами. Актуален при миграции с java версий ранее 1.5 на современные версии.
До
public class Generify {
public static void main(String[] args) {
List list = getList();
Object message = list.get(0);
System.out.println(message);
}
private static List getList() {
ArrayList arrayList = new ArrayList();
arrayList.add("Hello, World!");
return arrayList;
}
}
После
public class Generify {
public static void main(String[] args) {
List<string> list = getList();
String message = list.get(0);
System.out.println(message);
}
private static List<string> getList() {
ArrayList<string> arrayList = new ArrayList<>();
arrayList.add("Hello, World!");
return arrayList;
}
}
Пункт «Migrate»
Предоставляет готовые миграции для следующего списка:
А также предоставляет возможность делать свои. Вот, например, правила миграции для JUnit(4.x -> 5.0):
Вот здесь есть подробное видео про миграцию для JUnit(4.x -> 5.0).
Пункт «Lombok» и «Delombok»
Предоставляются плагином “Lombok”. Недавно было объявлено, что теперь он будет входить в стандартную поставку IDEA. Используется при работе с библиотекой кодогенерации “Lombok”.
Пункт «Internationalize»
Используется для интернационализации. К сожалению, в справке не нашел на данный момент информации. IDEA сейчас активно локализуется на другие языки, скорее всего для этого был разработан этот метод.
Список источников
-
Прекрасный доклад про атомарный рефакторинг от Тагира Валеева
-
Справка IDEA
-
Refactoring: Improving the Design of Existing Code (Martin Fowler)
Теги: программирование на java, разработчик java, intellij idea, среда разработки intellij idea
Всем нам хорошо известна среда разработки IntelliJ IDEA. В этой заметке я собрал список наиболее полезных клавиш в IDEA, которыми пользуюсь практически каждый день, и без которых работа выполнялась бы намного медленнее. При этом я постарался отсортировать каждый раздел от наиболее часто используемых к наименее.
Keymap:
mac — Mac OS X 10.5+
win/linux — Default
⌘ — Command
⌃ — Control
⌥ — Option (Alt)
⇧ — Shift
0. Универсальная комбинация от всех проблем
Mac OS | Win/Linux | Описание | Примечание |
---|---|---|---|
⌥ + Enterl | Alt + Enter | показать быстрые действия, исправить код |
1. Навигация по коду
Mac OS | Win/Linux | Описание | Примечание |
---|---|---|---|
⌘ + O | Ctrl + N | открыть класс | |
⌘ + ⇧ + O | Ctrl + Shift + N | открыть файл | |
⌘ + ⌥ + Left/Right | Ctrl + Alt + Left/Right | назад/вперед по истории навигации | |
⌘ + B | Ctrl + B | перейти к декларации (переменной/метода), показать использование переменной/метода | |
⌘ + ⌥ + B | Ctrl + Alt + B | перейти к имплементации метода | |
⌘ + E | Ctrl + E | последние открытые файлы | |
⌘ + ⇧ + E | Ctrl + Shift + E | последние редактированные файлы | |
⌘ + F12 | Ctrl + F12 | список методов текущего класса | начать набирать имя метода для фильтрации |
2. Рефакторинг/редактирование/генерация кода
Mac OS | Win/Linux | Описание | Примечание |
---|---|---|---|
⌃ + ⌥ + O | Ctrl + Alt + O | оптимизировать раздел import | |
⌘ + ⌥ + L | Ctrl + Alt + L | автоматически отформатировать код | |
⌘ + N | Alt + Insert | сгенерировать код (конструктор, геттер, сеттер, equals, hashCode) | |
⇧ + F6 | Shift + F6 | переименовать (класс, метод, поле, переменную), включая все использования и референсы | |
⌘ + ⌥ + V | Ctrl + Alt + V | вынести выражение в переменную | |
⌃ + O | Ctrl + O | переопределить метод | |
⌃ + I | Ctrl + I | имплементировать метод | |
⌃ + G | Alt + J | выделить следующее появление текста (next occurence) | удобно подменять одну переменную другой при рефакторинге |
⌘ + | Ctrl + / | закомментировать однострочным комментарием | |
⌘ + ⇧ + / | Ctrl + Shift + / | закомментировать многострочным комментарием | |
⌘ + ⇧ + 8 | Shift + Alt + Insert | переключить режим редактирования (обычный/колонка) | удобно редактировать большие куски выровненного кода, файлов .properties |
⌥ + ⌥(зажать) + Up/Down | Ctrl + Ctrl(зажать) + Up/Down | выделить следующую/предыдущую строку в режиме колонки | нажать и отпустить и тут же зажать Option (mac) или Ctrl (win/linux). Удобнее чем, переключаться в режим редактирования колонкой для небольших кусков кода |
3. Прочее
Mac OS | Win/Linux | Описание | Примечание |
---|---|---|---|
⌃ + R/D | Shift + F10/F9 | запуск/дебаг текущей выбранной конфигурации | |
⌃ + ⇧ + R/D | Ctrl + Shift + F10/F9 | запуск/дебаг конфигурации из контекста | |
⌃ + ⌥ + R/D | Alt + Shift + F10/F9 | выбор конфигурации и запуск/дебаг | |
⌘ + ⇧ + F8 | Ctrl + Shift + F8 | открыть окно брейкпоинтов | |
⇧ + ⇧ | Shift + Shift | поиск везде | |
⌘ + ⇧ + A | Alt + ` | поиск действий | |
⌃ + V | Content Cell | быстрое меню системы контроля версий | |
⌘ + K | Ctrl + K | сделать коммит |
Комбинаций клавиш в IDEA очень много, все упомянуть/запомнить почти невозможно. В данном посте я описал только те комбинации, которые помню и которыми пользуюсь сам и без которых не могу представить работу в IDEA. В комментариях пишите самые полезные, на ваш взгляд, комбинации.
Поиск/Замена (это земаст!)
Ctrl + N поиск класса, далее ALT+(-> / <-) - выбор ищем Files, All и т.д.
Ctrl + F поиск на текущем классе
Ctrl + R автозамена на текущем классе
Ctrl + Shift + F поиск выражений в проекте/модулях/директориях
Ctrl + Left Mouse провалиться в метод/класс и т.д. чтобы прочитать про него
Ctrl + ALT + (<-) вернуться назад, или вперед (ВАЖНО)
Ctrl + B на классе/методе подняться до объявления класса/метода,
а если еще раз нажать в объявлении, то увидим, где используется класс/метод
Ctrl + ALT + L авто выравнивание кода
Ctrl + Y удалить строку (целиком)
Ctrl + X вырезать строку (целиком)
Ctrl + D создать дубликат строки
Ctrl + W + W + ... выделение кода (слово -> строка -> блок -> метод -> класс и тд)
Ctrl + Shift + W обратное снятие выделения
Ctrl + Insret выделение строки целиком
Shift + End выделить все что справа от курсора в строке
Ctrl + Shift + [стрелка выше/ниже] перемещение вверх/вниз строки в коде
Запилить кусок кода в структуру:
1. Ctrl + W много раз до готовности
2. Ctrl + Alt + T
3. [нажать цифру на клаве, например '6' = try{} catch{}]
Создание структур с нуля:
' fori ' + (Tab или Enter) + Tab сразу забиваем второй критерий в цикле for и цикл готов!
' foreach ' + (Tab или Enter) шаблон для цикла типа ' for each ' - просто добавь воды)
' iter ' + (Tab или Enter) перебрать элементы коллекции
Быстрая отладка.
Shift + F9 запуск отладки
F8 построчный прогон без захода в методы
F7 с заходом в методы
Alt + F8 открыть окно эмуляции (=отладка в отладке)
Alt + F9 прогнать до курсора
Атомарная отладка с заходом в контекстные методы:
ставим breakpoint на строке public static void main => Shift + F9 => F7, F7...
Рефакторинг.
Shift + F6 переименовать переменную
Ctrl + F6 изменить сигнатуру метода
Навигация:
Ctrl + Q где стоит курсор, показать подробности метода/класса/значения и т.д.
Ctrl + P напомнить сигнатуру
Alt + F7 где стоит курсор, показать все места где используется метод/класс/значение и т.д.
Alt + 1 скрыть/показать панель 'Project'
Ctrl + Alt + O удалить неисп. импорты
Alt + [стрелка влево/вправо] перемещение по закладкам
Промежуточная обработка текста, который вы откуда то скопировали:
0. Ctrl + C на тексте неважно откуда
1. WIN + R окно винды ВЫПОЛНИТЬ...
2. Ctrl + V и редактируем, убираем лишнее
3. Ctrl + A выделяем результат редактирования
4. Ctrl + C копируем выделенный результат редактирования
5. Ctrl + V вставляем куда нужно
Быстрое создание переменной (если написали метод/экземпляр, который что-то возвращает,
а нужно результат запилить на переменную) Alt+Enter, [introduce local variable] Enter
Ctrl + Shift + U Переключить в "ВЕРХНИЙ/нижний" регистр
Ctrl + Z Undo, отменить последнее действие
Ctrl + Shift + Z Redo, отменить последнюю отмену действия
Ctrl + Shift + V Расширенная вставка из буфера обмена (с историей)
Ctrl (+ Shift) + W Инкрементальное выделение выражения
Ctrl + влево/вправо Перемещение между словами
Ctrl + вверх/вниз Прокрутка кода без изменения позиции курсора
Ctrl + Home/End Переход в начало/конец файла
Shift + Del (Ctr + Y) Удаление строки, отличие в том, где потом окажется курсор
Ctrl + Del Удалить от текущей позиции до конца слова
Ctrl + Backspace Удалить от текущей позиции до начала слова
Ctrl + D Дублировать текущую строку
Tab / Shift + Tab Увеличить/уменьшить текущий отступ
Ctrl + Alt + I Выравнивание отступов в коде
Ctrl + Alt + L Приведение кода в соответствие code style
Ctrl + / Закомментировать/раскомментировать текущую строку
Ctrl + Shift + / Закомментировать/раскомментировать выделенный код
Ctrl + -/+ Фолдинг, свернуть/развернуть
Ctrl + Shift + -/+ Фолдинг, свернуть/развернуть все
Ctrl + Shift + . Сделать текущий скоуп сворачиваемым и свернуть его
Ctrl + . Сделать текущий скоуп несворачиваемым
Ctrl + R Замена в тексте
Ctrl + Shift + R Замена во всех файлах
Ctrl + W + W Выделить всю строку
Окна, вкладки:
Alt + влево/вправо Перемещение между вкладками
Ctrl + F4 Закрыть вкладку
Alt + циферка Открытие/закрытие окон Project, Structure, Changes и тд
Ctrl + Tab Switcher, переключение между вкладками и окнами
Shift + Esc Закрыть активное окно
F12 Открыть последнее закрытое окно
Ctrl + колесико Zoom, если он был вами настроен:
(Settings -> Editor -> General | Mouse Control , ставим галочку на 'Change font size with Ctrl + Mouse')
Закладки:
F11 Поставить или снять закладку
Ctrl + F11 Аналогично с присвоением буквы или цифры
Shift + F11 Переход к закладке (удаление — клавишей Delete)
Ctrl + Число Быстрый переход к закладке с присвоенным числом
Подсказки и документация:
Ctrl + Q Документация к тому, на чем сейчас курсор
Ctrl + Shift + I Показать реализацию метода или класса
Alt + Q Отобразить имя класса или метода, в котором мы находимся
Ctrl + P Подсказка по аргументам метода
Ctrl + F1 Показать описание ошибки или варнинга
Alt + Enter Показать, что нам предлагают «лампочки»
Поиск:
Дважды Shift Быстрый поиск по всему проекту
Ctrl + Shift + A Быстрый поиск по настройкам, действиям и тд
Alt + вниз/вверх Перейти к следующему/предыдущему методу
Ctrl + [ и Ctr + ] Перемещение к началу и концу текущего скоупа
Ctrl + F Поиск в файле
Ctrl + Shift + F Поиск по всем файлам (переход — F4)
Ctrl + F3 Искать слово под курсором
F3 / Shift + F3 Искать вперед/назад
Ctrl + G Переход к строке или строке:номеру_символа
Ctrl + F12 Список методов с переходом к их объявлению
Ctrl + E Список недавно открытых файлов с переходом к ним
Ctrl + Shift + E Список недавно измененных файлов с переходом к ним
Ctrl + H Иерархия наследования текущего класса и переход по ней
Ctrl + Alt + H Иерархия вызовов выбранного метода
Ctrl + N Поиск класса по имени и переход к нему
Ctrl + Shift + N Поиск файла по имени и переход к нему
Ctrl + B Перейти к объявлению переменной, класса, метода
Ctrl + Alt + B Перейти к реализации
Ctrl + Shift + B Определить тип и перейти к его реализации
Shift + Alt + влево Перемещение назад по стеку поиска
Shift + Alt + вправо Перемещение вперед по стеку поиска
F2 / Shift + F2 Переход к следующей/предыдущей ошибке
Shift + Alt + 7 Найти все места, где используется метод/переменная
Ctrl + Alt + 7 Как предыдущий пункт, только во всплывающем окне
Генерация кода и рефакторинг:
Ctrl + Space Полный автокомплит
Ctrl + Shift + Space Автокомплит с фильтрацией по подходящему типу
Alt + / Простой автокомплит по словам, встречающимся в проекте
Ctrl + I Реализовать интерфейс
Ctrl + O Переопределить метод родительского класса
Ctrl + J Генерация шаблонного кода (обход по итератору и тд)
Ctrl + Alt + J Обернуть выделенный код в один из шаблонов
Alt + Insert Генератор кода — сеттеров, зависимостей в pom.xml и тд
Shift + F6 Переименование переменной, класса и тд во всем коде
Ctrl + F6 Изменение сигнатуры метода во всем коде
F6 Перемещение метода, класса или пакета
F5 Создать копию класса, файла или каталога
Shift + F5 Создать копию класса в том же пакете
Alt + Delete Безопасное удаление класса, метода или атрибута
Ctrl + Alt + M Выделение метода
Ctrl + Alt + V Выделение переменной
Ctrl + Alt + F Выделение атрибута
Ctrl + Alt + C Выделение константы (public final static)
Ctrl + Alt + P Выделение аргумента метода
Ctrl + Alt + N Инлайнинг метода, переменной, аргумента или константы
Ctrl + Alt + O Оптимизация импортов (Удаляет все НЕиспользуемые import`ы)
Прочее:
Ctrl + ~ Быстрое переключение цветовой схемы, code style и тд
Alt + F12 Открыть/закрыть терминал
F10 Запустить последнюю запущенную программу или тест
Shift + F10 Запустить открытую в редакторе программу или тест
Shift + Alt + F10 Запустить что-то из списка того что запускалось раньше
Ctrl + F2 Остановить программу
Ctrl + Alt + A Добавить в систему контроля версий
Ctrl + K Сделать коммит в систему контроля версий
Ctrl + Shift + K Сделать пуш в систему контроля версий
Ctrl + Shift + P В Scala-плагине определяет implicit параметры
Ctrl + Shift + Q В Scala-плагине определяет implicit преобразования
Перезагрузить все проекты Maven (Reload All Maven Projects)
Если вы работаете в IntelliJ, есть четыре независимых способа обновления репозиториев maven. Каждый из них обновляет
другой локальный репозиторий на вашем компьютере или обновляет их по-разному.
1. mvn -U clean install
2. Ctrl + Shift + A - Reimport
3. В окне Maven (справа) -> нажать "Круглые стрелки"
4. Ctrl+Alt+S -> Build, Execution, Deployment -> Build Tools -> Maven -> Repositories -choose rep - update
Что интересно, часто говорят, что последнее обновление совпадает с круглыми стрелками в окне Maven. Но, по моему опыту,
они совершенно разные! Доказательство: нашему большому проекту не удалось выполнить последнее обновление, но он
существует и успешно работает без него. И двойные круглые стрелки работают нормально.
Каждый из этих четырех может помочь вам с вашими проблемами и / или найти собственные проблемы. Например, для запуска
нашего реального проекта нужен только первый, но для тестирования в IntelliJ нам также нужны 2 и 3. Конечно, кому-то
тоже нужно 4. (Почему еще он есть в IntelliJ?)
IntelliJ IDEA — настройка, горячие клавиши, debugging — введение в Java 025
#
(В разработке)
Сегодняшний программист очень сильно отличается от программиста 90-х.
Блокноты сменились мощными инструментами, которые подсказывают нам даже эффективные методы решения. Порой, кажется, что ещё чуть-чуть и людям точно не надо будет учить программирование, потому что Idea сделает всё сама.
Но пока этого не случилось нам стоит потратить немного времени на настройку самого главного инструмента, в котором мы пишем код. Idea может очень многое. Очень. В этой главе мы рассмотрим несколько горячих клавиш, некоторые типы подсказок и базисные вещи, которые нам предлагает рефакторинг и дебаггинг.
Давайте на секунду отвлечёмся от самого кодинга и попробуем настроить наш инструмент для работы с Java и подтянуть наши скилы для работы с ним.
Отладка программы в intellij idea
Рефакторинг
#
Alt + F6 — одна из самых полезных функций рефакторинг. Переименование переменной во всём коде программы, сколько бы раз она не упоминалась.
Для этого надо выделить название метода, класса или переменной и вызвать из контекстного меню или горячими клавишами безопасное переименование. Очень удобно и для тех случаев, когда класс создан с грамматической ошибкой. IDEA переименовывает и файл и класс одновременно.
Безопасное переименование переменных
Не только hotkeys
#
Горячие клавиши очень полезны в работе, но всё же не все функции доступны через клавиши.
Стоит выделить время и посмотреть что может программа: подобрать цветовую гамму, шрифты и их размер, научиться делить окна на рабочие зоны.
Как открыть одновременно 2 класса в IDEA?
#
Например мы можем работать одновременно в нескольких классах (файлах). Эта функция доступна нам, если мы правой кнопкой нажмём на вкладку файла в окне, а затем на “Split Vertically” или “Split Horizontally”. Это очень удобно, когда программа состоит из больше, чем одного класса.
Разделить окно IDEA
Как добавить плагин в intellij idea?
#
File -> Settings -> Plugins здесь можно посмотреть, что уже установлено или добавить новый полезный плагин.
Например мне оказался очень полезен плагин Grazie — проверка орфографии.
Grazie — проверка орфографии
Проверка правописания в Intellij Idea для русского текста
#
File -> Settings -> Editor -> Proofreading
Здесь можно добавить те языки, которые нужны в работе над кодом и документацией.
Настройка проверки орфографии в IDEA
Горячие клавиши
#
“Alt + h + k”. В Idea есть возможность вызвать помощника по горячим клавишам “Alt + h + k” открывает pdf файл, где описаны поддерживаемые вызовы.
Настройка консоли
#
Порой выдача в консоли не всегда очевидна или понятна. Или требуется пересчитать элементы. “CTRL + F” поможет нам в поиске определённых символов или слов и подсветит их.
Поиск результата в консоли
Отладка программы
#
Отладка Java кода в IDEA. Основные возможности отладчика.
I work in a pretty large Java-project (2500+ classes) that uses an old code standard where all
member variables are prefixed with «m_» (e.g m_temperature). There is really no reason for this any longer and I’d like to get rid of them but:
- In order to make the change I must do all variables at once.
- It must not generate any bugs.
The first naive approach of simply renaming all the «m_variable» to just «variable» will not be sufficient as that could produce name collisions between an already existing variable named «variable», and the newly renamed one.
So, to sum up:
How do I rename all these pesky member variablest without getting into trouble and are there any more problems than the one mentioned above?
Yes, I’m aware of the refactoring/renaming features within IDEs, please bear in mind that I want to do the changes to all variables matching the criteria at once and not by right-clicking on variables and renaming them one-by-one.
asked Feb 16, 2012 at 9:11
tommystommys
8651 gold badge11 silver badges21 bronze badges
7
How about below from : mass renaming of java variables
by Simulant
click on the variable name.
1:press [alt] + [shift] + [R]
2:enter the new name.
3:press [enter] to confirm.
—>all instances of this variable will be renamed.
answered Dec 10, 2014 at 2:08
smwikipediasmwikipedia
60.2k91 gold badges298 silver badges473 bronze badges
1
Theres a question on SC which is about a massive refactoring in java too. The best answer is using japvaparser and implementing a visitor to do the actual refactoring. This shouldn’t be that much work for a simple rename.
answered Feb 16, 2012 at 10:06
wintersolutionswintersolutions
5,1445 gold badges29 silver badges51 bronze badges
1
To answer your second question (are there any more problems)
- I would avoid global variables. Favour encapsulation such that you can localise functionality.
- I would implement some unit tests such that you can verify future changes. At the moment it appears your only available check is that your project compiles properly.
I realise both of these are potentially sizable issues in an existing project. But it’s worth lookingto identify possible pain points and work on those first of all.
answered Feb 16, 2012 at 9:15
Brian AgnewBrian Agnew
266k36 gold badges331 silver badges439 bronze badges
1
Refactoring tool will help in this case. When you rename a variable, it will rename it in all dependent places including if it is called in different class file. While doing this, it will alert you in case if your renamed variable matches with already existing name.
However we have to do it manually for each variable.
answered Feb 16, 2012 at 9:18
JayyJayy
2,3384 gold badges24 silver badges34 bronze badges
0
If you are using eclispe
IDE, you can do it in easy manner.
Steps:
- select the variable
- right click on it
- click on refactor
- click on rename
even in netbeans
you can follow same steps.
The IDE finds the reference and usages and replace it all.
answered Feb 16, 2012 at 9:17
dku.rajkumardku.rajkumar
18.3k7 gold badges40 silver badges58 bronze badges
1
I work in a pretty large Java-project (2500+ classes) that uses an old code standard where all
member variables are prefixed with «m_» (e.g m_temperature). There is really no reason for this any longer and I’d like to get rid of them but:
- In order to make the change I must do all variables at once.
- It must not generate any bugs.
The first naive approach of simply renaming all the «m_variable» to just «variable» will not be sufficient as that could produce name collisions between an already existing variable named «variable», and the newly renamed one.
So, to sum up:
How do I rename all these pesky member variablest without getting into trouble and are there any more problems than the one mentioned above?
Yes, I’m aware of the refactoring/renaming features within IDEs, please bear in mind that I want to do the changes to all variables matching the criteria at once and not by right-clicking on variables and renaming them one-by-one.
asked Feb 16, 2012 at 9:11
tommystommys
8651 gold badge11 silver badges21 bronze badges
7
How about below from : mass renaming of java variables
by Simulant
click on the variable name.
1:press [alt] + [shift] + [R]
2:enter the new name.
3:press [enter] to confirm.
—>all instances of this variable will be renamed.
answered Dec 10, 2014 at 2:08
smwikipediasmwikipedia
60.2k91 gold badges298 silver badges473 bronze badges
1
Theres a question on SC which is about a massive refactoring in java too. The best answer is using japvaparser and implementing a visitor to do the actual refactoring. This shouldn’t be that much work for a simple rename.
answered Feb 16, 2012 at 10:06
wintersolutionswintersolutions
5,1445 gold badges29 silver badges51 bronze badges
1
To answer your second question (are there any more problems)
- I would avoid global variables. Favour encapsulation such that you can localise functionality.
- I would implement some unit tests such that you can verify future changes. At the moment it appears your only available check is that your project compiles properly.
I realise both of these are potentially sizable issues in an existing project. But it’s worth lookingto identify possible pain points and work on those first of all.
answered Feb 16, 2012 at 9:15
Brian AgnewBrian Agnew
266k36 gold badges331 silver badges439 bronze badges
1
Refactoring tool will help in this case. When you rename a variable, it will rename it in all dependent places including if it is called in different class file. While doing this, it will alert you in case if your renamed variable matches with already existing name.
However we have to do it manually for each variable.
answered Feb 16, 2012 at 9:18
JayyJayy
2,3384 gold badges24 silver badges34 bronze badges
0
If you are using eclispe
IDE, you can do it in easy manner.
Steps:
- select the variable
- right click on it
- click on refactor
- click on rename
even in netbeans
you can follow same steps.
The IDE finds the reference and usages and replace it all.
answered Feb 16, 2012 at 9:17
dku.rajkumardku.rajkumar
18.3k7 gold badges40 silver badges58 bronze badges
1