Может ли Java-приложение использовать больше памяти, чем размер кучи?

Возможно, вы замечали, что Java-приложение может превышать лимит памяти, указанный в параметре -Xmx (максимальный размер кучи). Дело в том, что JVM помимо кучи использует и другие области памяти. Давайте начнем со структуры памяти Java-приложения и источников потребления памяти. Читать


Выходя за рамки JUnit. Создаем сложные расширения

Переход от JUnit4 к новой версии во многом изменил способ расширения функциональных возможностей тестов. В JUnit4 основным механизмом расширения были правила, которые могли обернуть выполнение теста в дополнительную логическую обработку. Например, в реализации абстрактного класса ExternalResource встраивали два дополнительных вызова методов инициализации и финализации. Модель JUnit 5 существенно дополнена, и в этой статье мы рассмотрим, как можно создавать собственные расширения для JUnit Platform.


Запросы к MongoDB из Java с помощью билдера фильтров

В этой статье разберемся, как использовать класс Filters для запросов к MongoDB. Читать


JDBC vs JPA

В мире разработки программного обеспечения очень любят аббревиатуры. И работа с базами данных в Java — не исключение. Наличие множества вариантов работы с БД может запутать: что же я использую на самом деле? Все используют JPA? Мне тоже стоит его использовать? Но я еще слышал о Spring Data JDBC. А как насчет Spring Data JPA? В этой статье мы поговорим о JDBC и JPA: истории появления и некоторых особенностях.


Java библиотека для работы с внешним сервисом по протоколу RESTful API

Для работы с внешними сервисами по протоколу RESTful API обычно бывает вполне достаточно встроенных средств языка Java или внешних библиотек, используемых в коде приложения там, где это необходимо. Пример – библиотека java.net.http.HttpClient, пользоваться ей очень легко. Для Spring Framework все еще лучше – встроенный RestTemplate позволяет делать почти все. Однако, иногда в разработке может возникнуть ситуация, когда этого недостаточно.

Рассмотрим именно такую ситуацию на примере mlsgrid — коммерческого RestAPI для получения информации об объектах недвижимости. Читать далее


Как сгенерировать UUID в качестве первичных ключей при помощи Hibernate

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

Например, в последние годы приобрели популярность UUID. Основным преимуществом UUID является его глобальная уникальность, которая дает огромное преимущество для распределенных систем. Читать дальше


Парсинг JSON с помощью Jackson

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


FAQ по var в Java

Локальные переменные — это «рабочие лошадки» Java. Они используются для хранения промежуточных результатов вычислений. И, в отличие от полей, объявляются, инициализируются и используются в одном блоке. Для понимания кода часто более важны имя и инициализатор, чем тип локальной переменной. В имени и инициализаторе столько же информации, сколько и в типе. Читать далее


JUnit: тестирование методов, вызывающих System.exit()

В определенных ситуациях нам может потребоваться, чтобы метод вызывал System.exit() и завершал работу приложения. Например, в случае если приложение должно быть запущено только один раз, а затем завершено, или в случае фатальных ошибок, таких как потеря соединений с базой данных.

Если метод вызывает System.exit(), вызвать его из юнит-тестов и делать ассерты становится трудно, потому что это приведет к завершению юнит-теста. В этом посте мы рассмотрим, как тестировать методы, вызывающие System.exit() с использованием фреймворка JUnit.


Абстрактные классы и интерфейсы в Java

Абстрактные классы и интерфейсы встречаются повсюду как в Java-приложениях, так и в самом Java Development Kit. Каждый из них служит своей цели:

  • Интерфейс — это контракт, который должен быть реализован конкретным классом.
  • Абстрактный класс похож на обычный, но отличается тем, что может содержать абстрактные методы — методы без реализации, и нельзя создать экземпляр абстрактного класса.

Многие разработчики не видят разницы между интерфейсами и абстрактными классами, но на самом деле между ними есть существенное различие.