1. IntelliJ IDEA

IntelliJ IDEA – одна из самых мощных универсальных сред разработки. Она поддерживает такие языки, как PHP, JavaScript, Sass, Ruby, Python и конечно же Java. Так же есть поддержка популярных фреймворков и движков, тестов для кода, адаптацию под мобильные устройства, интеграцию с Git и Mercurial, инструменты для работы с серверами.

Существует две версии IntelliJ IDEACommunity и Unlimited. Первая – бесплатная, но ограниченная. В ней не поддерживаются фреймворки Spring, Vaadin, GWT, языки JavaScript и TypeScript, SQL и многое другое. Вторая включает в себя всевозможные фичи для коллективной разработки, но бесплатна будет только 30 дней пробного периода.

1.1. Установка

Для Linux необходимо распаковать ideaIC.gz в директорию, которая поддерживает выполнение файлов. Для иерархии формата FHS это /opt. После этого необходимо перейти в поддиректорию /bin и запустить файл idea.sh.

В MacOS — двойной щелчок на файле ideaIC.dmg, монтировать архив и копировать исходники в папку Applications.

Для установки в ОС Windows необходимо скачать с официального сайта исходник с расширением .exe. Далее запускать его и следовать инструкциям установщика.

1.2. Настройка

При первом запуске IntelliJ IDEA появится диалоговое окно с требованием указать путь до файла с настройками. Необходимо выбрать пункт Do not import settings. Если данное окно появилось после обновления или переустановки – выбрать исходную директорию.

complete installation

Следующим шагом настройки IntelliJ IDEA будет выбор темы. ПО умолчанию их две – стандартная (светлая) и Darcula (тёмная).

customize intellij idea

IntelliJ IDEA поддерживает огромное количество вспомогательных инструментов. Разумеется, новичку они все не нужны. Поэтому необходимо отключить их для увеличения производительности. Для этого в очередном диалоговом окне выбрать Disable All. Их можно подключить позднее в меню настроек.

customize intellij idea 2

customize intellij idea 3

1.3. Первый проект в IntelliJ IDEA

После установки и настройки IntelliJ IDEA, можно приступить к работе. Для этого необходимо создать проект в IntelliJ IDEA.

welcom to intellij idea

Диалоговое окно предлагает варианты:

  • создать новый проект (Create New Project)

  • открыть существующий (Open)

  • импортировать проект (Import Project)

  • выйти из системы контроля версий (Check out from Version Control)

Нужно выбрать первый пункт. Подробнее о том, как создать проект IntelliJ IDEA, что делать уже внутри среды, лучше почитать на официальном сайте, потому что возможностей для кастомизации рабочего пространства здесь действительно много.

2. Debugging

Debugging (Отладка) — это один из самых важных этапов процесса разработки. И дело не только в том, что устранение ошибок занимает, вероятно, большую часть времени: она также особенно необходима при создании бизнес-логики, написании алгоритмов и тестировании кода.

2.1. Breakpoints

Существуют 4 типа breakpoint в IntelliJ IDEA.

2.1.1. Line breakpoint

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

Breakpoint

2.1.2. Breakpoint для метода

Останавливает приложение при входе/выходе из указанного метода или одной из его реализаций и позволяет проверять условия этого процесса. Данный вид breakpoint может сильно замедлить процесс отладки, так что использовать его следует аккуратно и только в случае необходимости.

2.1.3. Breakpoint для исключений

Останавливает приложение при выбрасывании Throwable или его подклассов.

2.1.4. Field watchpoint

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

2.2. Работа с breakpoints

Для создания breakpoint используйте "горячие" клавиши Ctrl + F8. Тип breakpoint (для строки кода, для метода или для доступа к полю класса) будет зависеть от того, где вы ее создаете. Для просмотра списка всех breakpoint используйте Ctrl + Shift + F8.

Breakpoint’s window

Эта возможность сэкономит вам часы работы, а также избавит вас от необходимости искать breakpoint и удалять их вручную в том случае, если они останавливают процесс выполнения кода вопреки вашему намерению. Кроме того, данная опция позволяет вам просто их отключить, в результате чего точки не будут останавливать код во время отладки, но при необходимости вы сможете легко включить их повторно. Поэтому вам не нужно запоминать все важные места в проекте и каждый раз создавать и удалять все breakpoint.

2.2.1. Suspend (Приостановка)

Определяет, следует ли остановить выполнение приложения в момент достижения breakpoint. Имеет два возможных значения:

  • All

  • Thread

При выборе all происходит приостановка всех потоков, когда какой-либо из них достигает контрольной точки. При выборе thread приостанавливается лишь один поток, достигший этой точки.

2.2.2. Condition (Условие)

Эта опция позволяет задать условие, подлежащее проверке каждый раз при достижении breakpoint. Если условие возвращает значение true, то выполняется заданное действие, в противном же случае контрольная точка пропускается.

В качестве условия вы можете использовать:

  • различные инструкции, включающие объявления, циклы, анонимные классы и т. д.;

  • this (не используется в статическом контексте), например !(this instanceof User);

  • проверка логических типов или выражений.

2.2.3. Опции логирования

При достижении breakpoint в консоль может быть выведено следующее:

  • Сообщение о достижении breakpoint: лог сообщает нам Breakpoint reached at package.User.main(User.java:10).

  • Трассировка стека для текущего окна Frame. Это удобно, если вы намерены проверить, какие методы были вызваны до момента достижения breakpoint.

  • Вычисление выражения и запись результата в консоль: результат произвольного выражения, например "Creating…​" или users.size().

2.2.4. Remove once hit (Удаление breakpoint при ее достижении)

Определяет, следует ли удалить точку останова из проекта после того, как она была достигнута.

2.2.5. Disable until hitting the following breakpoint (Отключение breakpoint до момента достижения другой точки)

Отключает текущую точку останова до тех пор, пока не будет достигнута заданная точка. Вы также можете решить, отключить ли ее после того, как это произошло, или нет.

2.2.6. Filters (Фильтры)

IntelliJ IDEA позволяет также настраивать работу с точками, отфильтровывая классы/экземпляры/методы и выполняя остановку только в нужных местах.

В распоряжении следующие типы фильтров:

  • Catch class filters (классовые фильтры перехвата). Они останавливают приложение при перехвате исключения в заданных классах.

  • Instance filters (фильтры экземпляров класса). Эти фильтры указывают на экземпляры объектов, для которых будет срабатывать breakpoint.

  • Class filters (фильтры классов). Они задают классы, в которых будет срабатывать точка.

  • Caller filters (фильтры вызовов). Данный тип фильтров ограничивает действие breakpoint в зависимости от вызова текущего метода. Эта опция вам пригодится, если нужно остановиться на точке только в случае вызова этого метода из заданного метода.

2.2.7. Field access/modification (Доступ к полю класса/изменение поля класса)

  • Field access. Используйте эту опцию, чтобы breakpoint срабатывал при обращении к полю класса.

  • Field modification. Если вы хотите, чтобы breakpoint срабатывал при внесении изменений в поле класса, то выбирайте данную опцию.

2.2.8. Pass count (Количество проходов)

Определяет, должна ли сработать breakpoint после того, как она была пройдена заданное количество раз. Эту опцию удобно применять для циклов отладки или рекурсивных методов.

2.2.9. Caught/uncaught exception (Обработанное/необработанное исключение)

  • Caught exception. Опция предназначена для срабатывания breakpoint при условии, что заданное исключение было обработано.

  • Uncaught exception. Выберите эту опцию для срабатывания breakpoint в том случае, если заданное исключение не было обработано. Так вы сможете выявить причины необработанных исключений.

2.3. Лучшие практики использования breakpoint

Для логирования отладки используйте breakpoint, но не инструкцию System.out.println().

Используйте breakpoint для ведения логов вместо добавления в код System.out.print(). Это позволит применить более гибкий подход к процессу логирования в приложении, а также избежать написания грязного кода и внесения случайных изменений при выполнении Git-коммитов.

Прибегайте к помощи "горячих" клавиш для добавления breakpoint, так вы сэкономите довольно много времени.

Использование "горячих" клавиш открывает прекрасные перспективы более продуктивного программирования. Не забывайте про них.

Объединяйте breakpoint в группы.

Вы можете создать группу breakpoint, например в том случае, если вам нужно отметить точки для решения какой-либо особой задачи. В диалоговом окне Breakpoints (Ctrl + Shift + F8) выберите сначала точку, которую необходимо добавить в группу, а затем — Move to a group.

Выясните исходную причину критических ошибок.

Точки останова для исключений работают с Throwable. Вы можете добавить условие, которое поможет вам останавливать выполнение кода только при выбрасывании Error, или вы можете свести всё к MyCustomException.

Не используйте breakpoint для метода без необходимости.

Эти точки могут чрезвычайно замедлить выполнение кода, что приведет к значительным потерям времени.

Не удаляйте breakpoint полностью.

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

Добавьте описание к точке останова.

Это поможет вам вспомнить, почему вам нужна именно эта точка из числа многих других.

2.4. Stepping

Stepping- это пошаговое выполнение программы.

Когда выполнение кода останавливается на вашей точке, вы можете передвигаться по нему с помощью разных типов шагов. Ниже представлена панель шагов.

Stepping

Рассмотрим каждый из них подробнее.

  • Step over (F8) — Шаг с обходом
    Данная команда позволяет перешагнуть через текущую строку кода и перейти к следующей. Реализация методов пропускается, и вы переходите к следующей строке текущего метода.

  • Step into (F7) — Шаг с заходом
    Благодаря этому шагу вы переходите внутрь метода для просмотра его кода. Эта опция подходит для тех случаев, когда вы не уверены, что метод возвращает правильное значение.

  • Step out (Shift + F8) — Шаг с выходом
    При помощи этой команды вы выходите из текущего метода и переходите к вызывающему методу.

  • Run to cursor (Alt + F9) — Выполнение до курсора
    Данная команда продолжает выполнение приложения до текущей позиции курсора.

  • Force step over (Shift + Alt + F8) — Принудительный шаг с обходом
    Используя эту команду, вы обходите текущую строку кода и переходите к следующей. Если в вызываемых методах есть breakpoint, то они игнорируются.

  • Drop frame — Возврат к предыдущему фрейму
    Эта команда позволяет отменить последний фрейм стека и восстановить предыдущий. Это удобно, например, если вы по ошибке слишком далеко "прошагали" или хотите зайти в функцию, где пропустили важный блок кода.

  • Resume program (Ctrl + F9) — Возобновление программы
    Эта команда возобновляет выполнение приложения до следующей breakpoint.

2.5. Окно инструментов отладки

Когда вы начинаете отладку, перед вами открывается соответствующее окно инструментов (Debug). Оно используется для контроля за сеансом отладки, отображением и анализом данных программы, а также для выполнения различных действий данного процесса.

Debug window

В этом окне вы можете видеть созданные объекты, свойства, исключения, значения и т. д. Данная опция удобна для тех случаев, когда вам нужно:

  • убедиться в том, что все свойства инициализированы правильно;

  • уточнить, какие параметры получил метод;

  • посмотреть на трассировку стека исключений.

2.6. Лучшие практики пошагового выполнения программы

Step Into (шаг с заходом) применим даже для методов из внешних библиотек.

Иногда внешние библиотеки также могут содержать ошибки. Отладка внешней библиотеки может помочь вам обнаружить неверный код и сообщить о нем ее разработчикам. Или может возникнуть другая проблема. Например, если метод из внешней библиотеки возвращает неожиданное значение, войдите в него для выяснения причины подобного поведения. Возможно, это произошло из-за ошибки в методе объекта equals()/hashcode() и т. д. или по причине переопределения некоторых классов данной библиотеки в вашем проекте.

Используйте Show Execution Point (Отображение точки выполнения)

Если вы потеряли место, где остановилось выполнение кода, используйте Show Execution Point (Alt + F10) для перехода к достигнутой точке останова.

Просматривайте стек вызовов.

Иногда причина неожиданного поведения может затаиться там, где у вас нет breakpoint. Обратитесь к стеку вызовов и посмотрите, какие методы были выполнены. Это поможет вам найти среди них ошибочный. Кроме того, если вы перейдете к другому методу через стек вызовов, вы сможете увидеть предварительно полученные им параметры.

2.7. Вычисление выражений

IntelliJ IDEA также предоставляет возможность вычислять выражения в точке останова. Это удобный способ посмотреть, как поведет себя метод с другими значениями.

Для вычисления выражения используйте клавиши Alt + F8 или кнопку Evaluate.

Evaluate

2.8. Лучшие практики вычисления выражений

Вычисляйте все.

Если вам необходимо протестировать метод с разными значениями, не нужно создавать объекты вручную и перезапускать приложение. Можете просто вычислить эти значения в имеющемся методе. Это поможет сэкономить время, а также увидеть все свойства возвращаемого объекта.

Evaluate может выполнять все.

IntelliJ IDEA позволяет вам вычислять не только локальные, но и различные внешние методы или методы java.*. Evaluate способен даже выполнять методы, отправляющие запрос к другому сервису, давая вам возможность просмотреть подробный ответ.

Будьте аккуратнее с потоками данных (Streams).

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

Забудьте о кнопке Run (Запуск) и используйте только Debug.

2.9. Итоги

Отладка иногда является весьма раздражающим и длительным, но при этом необходимым процессом в работе каждого разработчика. И IntelliJ IDEA предоставляет возможности и опции для того, чтобы сделать ее более удобной, простой и эффективной. Можно любить или не любить процесс отладки, но это не меняет то обстоятельство, что он является значимым этапом разработки.

3. Checkstyle plugin

3.1. Настройка Checkstyle Plugin

In files manager:

  • copy content from checkstyle.xml to checkstyle.xml in ${WORK_DIR_IDEA}/config/codestyles/

In IntelliJ IDEA:

  • go to FileSettingsPlugins

  • install CheckStyle-IDEA

  • go to FileSettingsCheckStyle

  • add checkstyle.xml as new configuration file

4. Lombok Plugin

4.1. Install Lombok Plugin

  1. File > Settings > Plugins

  2. Search Plugin Lombok

  3. Install Plugin Lombok

  4. File > Settings > Build, Execution, Deployment > Compiler > Annotation Processors

  5. Set flag Enable annotation processing

  6. Restart IDE