Порядок инициализации
1⃣ Статические переменные: если в классе есть статические переменные, то они будут инициализированы в первую очередь. Переменные будут инициализированы в том порядке в котором идут в коде.
2⃣ Статический блок инициализации: далее сработает блок инициализации статических переменных.
3⃣ Переменные экземпляра
4⃣ Блок инициализации переменных экземпляра
5⃣ Конструктор
Вывод кода:
Static Variables initialized!
Static Initialization Block initialized!
Instance Variables initialized!
Instance Initialization Block initialized!
Constructor initialized!Инициализация в Java является важным аспектом, который гарантирует, что объекты и переменные находятся в правильном состоянии перед их использованием. Понимание порядка инициализации помогает избегать ошибок и создавать надежные программы на Java.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11👨💻2
Интернирование строк (string intern) - это процесс хранения одной и той же строки только в одном экземпляре в пуле строк (string pool) для оптимизации использования памяти и ускорения сравнения строк.
Вместо того чтобы создавать новый объект строки каждый раз, когда вы используете литерал строки (например, "Hello, World!"), Java проверяет, существует ли уже такая строка в пуле строк. Если она там есть, Java использует существующий экземпляр строки, иначе создает новый и добавляет его в пул строк.
Интернирование строк выполняется с использованием метода
Интернирование строк имеет смысл использовать, если у вас есть множество одинаковых строк, и вы хотите оптимизировать использование памяти или ускорить сравнение строк. Однако не стоит интернировать каждую строку, так как это может привести к излишней нагрузке на пул строк и неэффективному использованию памяти.
Вместо того чтобы создавать новый объект строки каждый раз, когда вы используете литерал строки (например, "Hello, World!"), Java проверяет, существует ли уже такая строка в пуле строк. Если она там есть, Java использует существующий экземпляр строки, иначе создает новый и добавляет его в пул строк.
Интернирование строк выполняется с использованием метода
intern(), доступного для объектов класса String. Вызов этого метода на строке приводит к тому, что Java проверяет пул строк на наличие строки с таким же содержанием. Если строка уже существует в пуле строк, метод возвращает ссылку на существующий экземпляр. В противном случае он добавляет текущую строку в пул и возвращает ссылку на нее.Интернирование строк имеет смысл использовать, если у вас есть множество одинаковых строк, и вы хотите оптимизировать использование памяти или ускорить сравнение строк. Однако не стоит интернировать каждую строку, так как это может привести к излишней нагрузке на пул строк и неэффективному использованию памяти.
😱5👍2😁2
Liquibase - это мощный инструмент для управления изменениями в схеме базы данных. Он позволяет разработчикам и администраторам баз данных эффективно управлять эволюцией структуры базы данных в течение всего жизненного цикла приложения.
Вот несколько ключевых особенностей Liquibase:
1⃣ Контроль версий: Liquibase предоставляет механизм для контроля версий схемы базы данных. Вы можете определить изменения в формате XML, SQL, YAML и других, и Liquibase отслеживает, какие изменения уже были применены к базе данных, и какие ещё предстоит применить.
2⃣ Кросс-платформенность: Liquibase поддерживает множество СУБД, включая PostgreSQL, MySQL, Oracle, Microsoft SQL Server и многие другие. Это позволяет разработчикам использовать один и тот же инструмент для управления изменениями в разных системах.
3⃣ Автоматическое развертывание: Liquibase автоматически применяет изменения в схеме базы данных при запуске приложения или других сценариях. Это упрощает процесс развертывания и обновления базы данных.
4⃣ Интеграция с CI/CD: Liquibase легко интегрируется с системами непрерывной интеграции и доставки (CI/CD), что позволяет автоматизировать процесс управления изменениями в базе данных в рамках CI/CD конвейера.
5⃣ Поддержка миграций данных: Одной из сильных сторон Liquibase является поддержка миграции данных. Вы можете определить изменения в структуре базы данных и миграции данных в одном файле, что делает процесс обновления приложения более гибким и контролируемым.
В итоге, Liquibase представляет собой ценный инструмент для управления изменениями в базе данных, который способствует снижению рисков и упрощению развертывания приложений, работающих с базами данных.
Вот несколько ключевых особенностей Liquibase:
1⃣ Контроль версий: Liquibase предоставляет механизм для контроля версий схемы базы данных. Вы можете определить изменения в формате XML, SQL, YAML и других, и Liquibase отслеживает, какие изменения уже были применены к базе данных, и какие ещё предстоит применить.
2⃣ Кросс-платформенность: Liquibase поддерживает множество СУБД, включая PostgreSQL, MySQL, Oracle, Microsoft SQL Server и многие другие. Это позволяет разработчикам использовать один и тот же инструмент для управления изменениями в разных системах.
3⃣ Автоматическое развертывание: Liquibase автоматически применяет изменения в схеме базы данных при запуске приложения или других сценариях. Это упрощает процесс развертывания и обновления базы данных.
4⃣ Интеграция с CI/CD: Liquibase легко интегрируется с системами непрерывной интеграции и доставки (CI/CD), что позволяет автоматизировать процесс управления изменениями в базе данных в рамках CI/CD конвейера.
5⃣ Поддержка миграций данных: Одной из сильных сторон Liquibase является поддержка миграции данных. Вы можете определить изменения в структуре базы данных и миграции данных в одном файле, что делает процесс обновления приложения более гибким и контролируемым.
В итоге, Liquibase представляет собой ценный инструмент для управления изменениями в базе данных, который способствует снижению рисков и упрощению развертывания приложений, работающих с базами данных.
❤5🍓2👍1
🔁 Рекурсия — определение, описание, изображение какого-либо объекта или процесса внутри самого этого объекта или процесса, то есть ситуация, когда объект является частью самого себя.
В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия).
Количество вложенных вызовов функции или процедуры называется глубиной рекурсии. Рекурсивная программа позволяет описать повторяющееся или даже потенциально бесконечное вычисление, причём без явных повторений частей программы и использования циклов.
Методы в Java работают с использованием стека. Каждый раз, когда вызывается метод, он помещается на вершину стека и удаляется после выполнения. Если вложенные вызовы методов происходят слишком глубоко, стек может переполниться, и тогда Java выбрасывает StackOverflowError.
У каждого потока, создаваемого в программе Java, есть собственное пространство стека, которое не зависит от кучи Java. Общий размер стека, доступный приложению, задается во время запуска.
Аргумент JVM -Xss задаёт размер стэка. Например, -Xss2048k задает размер стека 2 МБ.
В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия).
Количество вложенных вызовов функции или процедуры называется глубиной рекурсии. Рекурсивная программа позволяет описать повторяющееся или даже потенциально бесконечное вычисление, причём без явных повторений частей программы и использования циклов.
Методы в Java работают с использованием стека. Каждый раз, когда вызывается метод, он помещается на вершину стека и удаляется после выполнения. Если вложенные вызовы методов происходят слишком глубоко, стек может переполниться, и тогда Java выбрасывает StackOverflowError.
У каждого потока, создаваемого в программе Java, есть собственное пространство стека, которое не зависит от кучи Java. Общий размер стека, доступный приложению, задается во время запуска.
Аргумент JVM -Xss задаёт размер стэка. Например, -Xss2048k задает размер стека 2 МБ.
🔥5🤩2👍1
🍝 Спагетти-код: когда разработка становится беспорядком
Спагетти-код – это одна из самых неприятных "болезней" в мире программирования. Этот термин используется для описания плохо организованного и труднопонимаемого кода, который напоминает спагетти – пасту, перепутанную в неразгадываемую массу.
Почему спагетти-код возникает?
1⃣ Недостаток планирования: Недостаточное предварительное проектирование приложения может привести к хаотичной разработке, когда каждая часть кода создается независимо от других.
2⃣ Отсутствие структуры: Если разработчики не следят за структурой проекта, код может быстро превратиться в беспорядок.
3⃣ Отсутствие документации: Неадекватно задокументированный код может сделать его понимание и редактирование настоящим испытанием.
4⃣ Недостаток опыта: Новички в программировании могут создавать спагетти-код из-за отсутствия опыта и знаний о лучших практиках.
Последствия спагетти-кода
1⃣ Сложность поддержки и обновления: Чем хаотичнее код, тем сложнее вносить изменения и устранять ошибки.
2⃣ Потеря производительности: Неэффективный код может значительно снижать производительность приложения.
3⃣ Затраты на ресурсы: Поддержание спагетти-кода требует больше времени и ресурсов, что увеличивает расходы.
4⃣ Ухудшение командной работы: Спагетти-код затрудняет совместную разработку, так как он сложночитаем и малопонятен для других разработчиков.
Борьба со спагетти-кодом
1⃣ Следуйте принципам хорошего кода: Используйте лучшие практики, такие как разделение на модули, понятные имена переменных и функций, а также хорошую документацию.
2⃣ Проводите рефакторинг: Периодически пересматривайте код, улучшайте его структуру и читаемость.
3⃣ Используйте паттерны проектирования: Они помогут создавать более организованный и масштабируемый код.
4⃣ Пишите тесты: Тестирование помогает выявить ошибки и обеспечить стабильность приложения.
5⃣ Обучайтесь и совершенствуйтесь: Непрерывное обучение и улучшение навыков помогут избежать создания спагетти-кода.
В итоге, избегайте спагетти-кода, стараясь писать чистый, структурированный и хорошо документированный код. Это сэкономит вам время, нервы и ресурсы в будущем и сделает вашу разработку более приятной и продуктивной. 🚀
#плохойкод
Спагетти-код – это одна из самых неприятных "болезней" в мире программирования. Этот термин используется для описания плохо организованного и труднопонимаемого кода, который напоминает спагетти – пасту, перепутанную в неразгадываемую массу.
Почему спагетти-код возникает?
1⃣ Недостаток планирования: Недостаточное предварительное проектирование приложения может привести к хаотичной разработке, когда каждая часть кода создается независимо от других.
2⃣ Отсутствие структуры: Если разработчики не следят за структурой проекта, код может быстро превратиться в беспорядок.
3⃣ Отсутствие документации: Неадекватно задокументированный код может сделать его понимание и редактирование настоящим испытанием.
4⃣ Недостаток опыта: Новички в программировании могут создавать спагетти-код из-за отсутствия опыта и знаний о лучших практиках.
Последствия спагетти-кода
1⃣ Сложность поддержки и обновления: Чем хаотичнее код, тем сложнее вносить изменения и устранять ошибки.
2⃣ Потеря производительности: Неэффективный код может значительно снижать производительность приложения.
3⃣ Затраты на ресурсы: Поддержание спагетти-кода требует больше времени и ресурсов, что увеличивает расходы.
4⃣ Ухудшение командной работы: Спагетти-код затрудняет совместную разработку, так как он сложночитаем и малопонятен для других разработчиков.
Борьба со спагетти-кодом
1⃣ Следуйте принципам хорошего кода: Используйте лучшие практики, такие как разделение на модули, понятные имена переменных и функций, а также хорошую документацию.
2⃣ Проводите рефакторинг: Периодически пересматривайте код, улучшайте его структуру и читаемость.
3⃣ Используйте паттерны проектирования: Они помогут создавать более организованный и масштабируемый код.
4⃣ Пишите тесты: Тестирование помогает выявить ошибки и обеспечить стабильность приложения.
5⃣ Обучайтесь и совершенствуйтесь: Непрерывное обучение и улучшение навыков помогут избежать создания спагетти-кода.
В итоге, избегайте спагетти-кода, стараясь писать чистый, структурированный и хорошо документированный код. Это сэкономит вам время, нервы и ресурсы в будущем и сделает вашу разработку более приятной и продуктивной. 🚀
#плохойкод
👍6🔥2🤯1😱1
Библиотека Lombok
Разрабатывая на Java, мы сталкиваемся с множеством рутинных операций, связанных с написанием геттеров, сеттеров, equals, hashCode и других стандартных методов. Есть способ существенно упростить этот процесс. В этом нам поможет библиотека Lombok!
Lombok – это основанная на аннотациях библиотека Java, позволяющая сократить шаблонный код. В Lombok предлагаются различные аннотации, цель которых – заменить ненужный повторяющийся код, писать который утомительно. Например, Lombok избавит вас от написания безаргументных конструкторов, методов
Преимущества Lombok
Уменьшение кода: С Lombok вы можете создавать классы с минимальным количеством шаблонного кода. Это уменьшает вероятность ошибок и сокращает объем написанного текста.
Читаемость: Уменьшение количества шума в коде делает его более читаемым и понятным.
Производительность: Lombok ускоряет процесс разработки, так как не нужно тратить время на написание рутиных методов.
Совместимость: Lombok совместим с различными интегрированными средами разработки (IDE) и средами сборки проектов.
Аннотация
Если вы хотите упростить разработку и сэкономить массу времени и усилий, то Lombok - отличный инструмент для вас. Он помогает уменьшить рутиный код и улучшить читаемость вашего проекта. Попробуйте Lombok в своем следующем проекте и оцените его удивительные преимущества! ✨
Разрабатывая на Java, мы сталкиваемся с множеством рутинных операций, связанных с написанием геттеров, сеттеров, equals, hashCode и других стандартных методов. Есть способ существенно упростить этот процесс. В этом нам поможет библиотека Lombok!
Lombok – это основанная на аннотациях библиотека Java, позволяющая сократить шаблонный код. В Lombok предлагаются различные аннотации, цель которых – заменить ненужный повторяющийся код, писать который утомительно. Например, Lombok избавит вас от написания безаргументных конструкторов, методов
toString(), equals() и hashCode(), для этого нужно просто добавить несколько аннотаций. Плюс, эта библиотека подключается прямо к вашей IDE, поэтому работа воспринимается так, словно вы написали весь шаблонный код сами.Преимущества Lombok
Уменьшение кода: С Lombok вы можете создавать классы с минимальным количеством шаблонного кода. Это уменьшает вероятность ошибок и сокращает объем написанного текста.
Читаемость: Уменьшение количества шума в коде делает его более читаемым и понятным.
Производительность: Lombok ускоряет процесс разработки, так как не нужно тратить время на написание рутиных методов.
Совместимость: Lombok совместим с различными интегрированными средами разработки (IDE) и средами сборки проектов.
Аннотация
@Data генерирует геттеры, сеттеры, toString(), equals() и hashCode(), что позволяет вам сосредотачиваться на бизнес-логике вашего приложения, а не на шаблонном коде.Если вы хотите упростить разработку и сэкономить массу времени и усилий, то Lombok - отличный инструмент для вас. Он помогает уменьшить рутиный код и улучшить читаемость вашего проекта. Попробуйте Lombok в своем следующем проекте и оцените его удивительные преимущества! ✨
👍15🔥3🤩1😍1
Множественное присваивание
Операция присваивания работает следующим образом: сначала вычисляется значение выражения в правой части, потом это значение присваивается переменной, которая размещается в левой части от знака ‘=‘.
Операция присваивания может иметь вид цепочки:
переменная1 = переменная2 = выражение;
В этом случае алгоритм выполнения следующий:
- сначала вычисляется значение выражения;
- результат вычисления выражения присваивается в переменную2;
- результат вычисления выражения присваивается в переменную1.
Цепочка (последовательность) из операций присваивания может содержать произвольное количество присваиваний.
Операция присваивания работает следующим образом: сначала вычисляется значение выражения в правой части, потом это значение присваивается переменной, которая размещается в левой части от знака ‘=‘.
Операция присваивания может иметь вид цепочки:
переменная1 = переменная2 = выражение;
В этом случае алгоритм выполнения следующий:
- сначала вычисляется значение выражения;
- результат вычисления выражения присваивается в переменную2;
- результат вычисления выражения присваивается в переменную1.
Цепочка (последовательность) из операций присваивания может содержать произвольное количество присваиваний.
👍7🤩1🍾1
Тернарный оператор (также известный как условный оператор) - это сокращенная форма записи условного выражения.
Он имеет следующий синтаксис:
В данном операторе условие - это выражение, которое вычисляется как true или false, и в зависимости от его значения возвращается либо значение_если_истина, либо значение_если_ложь.
Тернарный оператор часто используется для компактного присвоения значений переменным на основе условий. Пример:
Такой оператор удобен для упрощения кода и уменьшения его объема, когда необходимо выбирать между двумя значениями в зависимости от условия.
Он имеет следующий синтаксис:
условие ? значение_если_истина : значение_если_ложь;В данном операторе условие - это выражение, которое вычисляется как true или false, и в зависимости от его значения возвращается либо значение_если_истина, либо значение_если_ложь.
Тернарный оператор часто используется для компактного присвоения значений переменным на основе условий. Пример:
int max = (a > b) ? a : b;Такой оператор удобен для упрощения кода и уменьшения его объема, когда необходимо выбирать между двумя значениями в зависимости от условия.
😁7👍2🙏1🤣1
Константы в Java
В Java нет специального ключевого слова для определения константы как в других языках.
Константа в языке Java реализована комбинацией двух ключевых слов:
В Java нет специального ключевого слова для определения константы как в других языках.
Константа в языке Java реализована комбинацией двух ключевых слов:
static и final.static означает, что значение принадлежит классу. А final разрешает присвоить переменной значение только один раз.👍11👨💻2👎1🤔1
SerialVersionUID - это
Во время сериализации, если мы не объявляем SerialVersionUID в нашем классе, среда выполнения Java создает номер версии для класса, так что она может десереализировать его позже. Если во время десериализации, SerialVersionUID не соответствует, то процесс завершится с исключением
Процесс создания номера версии Jav'ой чувствителен ко многим метаданным класса включая количество полей, тип полей, модификаторы доступа полей, интерфейсов, которые реализованы в классе и прочего.
Лучшая практика в сериализации – это явно объявить SerialVersionUID, чтобы избежать любых проблем при де-сериализации, особенно если вы работаете с клиент-серверным приложением, которое опирается на сериализованные данные, например, RMI.
Под сериализацией здесь понимается только стандартный механизм Java (ObjectInputStream, ObjectOutputStream).
private static final поле типа long класса который реализует интерфейс Serializable.Во время сериализации, если мы не объявляем SerialVersionUID в нашем классе, среда выполнения Java создает номер версии для класса, так что она может десереализировать его позже. Если во время десериализации, SerialVersionUID не соответствует, то процесс завершится с исключением
InvalidClassException.Процесс создания номера версии Jav'ой чувствителен ко многим метаданным класса включая количество полей, тип полей, модификаторы доступа полей, интерфейсов, которые реализованы в классе и прочего.
Лучшая практика в сериализации – это явно объявить SerialVersionUID, чтобы избежать любых проблем при де-сериализации, особенно если вы работаете с клиент-серверным приложением, которое опирается на сериализованные данные, например, RMI.
Под сериализацией здесь понимается только стандартный механизм Java (ObjectInputStream, ObjectOutputStream).
👍6🔥2
Основные особенности JTwig включают:
1⃣ Простота использования: JTwig обладает чистым и интуитивно понятным синтаксисом, который напоминает язык шаблонов, такой как Mustache или Twig. Это делает создание и редактирование шаблонов достаточно простым даже для новичков.
2⃣ Поддержка переменных и условных операторов: JTwig позволяет вам вставлять переменные, выполнять условные операции и циклы в ваших шаблонах, что делает их более динамичными.
3⃣ Расширяемость: Вы можете расширить функциональность JTwig, добавив собственные пользовательские фильтры и функции, что делает его гибким инструментом для ваших потребностей.
4⃣ Интеграция: JTwig легко интегрируется с различными фреймворками и библиотеками Java, такими как Spring Framework, что делает его популярным выбором для создания веб-приложений.
JTwig предоставляет мощный и удобный способ управления шаблонами в ваших Java-приложениях, и его простота использования делает его привлекательным выбором для создания динамичного контента.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8👏2
Вот основные компоненты Java NIO:
Буферы (Buffers): Основная идея в Java NIO - работа с данными через буферы. Буферы - это области памяти, которые используются для временного хранения данных перед и после их обработки. Java NIO предоставляет разные типы буферов, такие как ByteBuffer, CharBuffer, IntBuffer и другие, каждый из которых предназначен для работы с определенными типами данных.
Каналы (Channels): Каналы представляют собой абстракцию для работы с источниками данных и целевыми местами данных. Каналы могут быть использованы для чтения из файлов, записи в файлы, работы с сетевыми соединениями и т. д. Основные классы для каналов включают FileChannel, SocketChannel, ServerSocketChannel и DatagramChannel.
Селекторы (Selectors): Селекторы предоставляют механизм для мультиплексирования операций ввода-вывода на нескольких каналах. Селекторы позволяют одному потоку обрабатывать несколько каналов одновременно, что делает Java NIO особенно полезным для серверных приложений, обслуживающих множество клиентов.
Преимущества Java NIO:
1⃣ Эффективность: Java NIO может быть более эффективным, чем традиционное Java IO, особенно при работе с большими объемами данных.
2⃣ Мультиплексирование: Селекторы позволяют одному потоку обрабатывать несколько каналов, что полезно для серверных приложений.
3⃣ Неблокирующий режим: Позволяет избегать блокировки потоков, что может увеличить производительность.
Недостатки Java NIO:
1⃣ Сложность: Java NIO может быть сложным в использовании и требует хорошего понимания его концепций.
2⃣ Не всегда подходит: Не все задачи требуют такого уровня контроля, какой предоставляет Java NIO.
📌 Java NIO является мощным инструментом для разработки высокоэффективных и масштабируемых приложений, особенно в области сетевого программирования и обработки больших объемов данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7😁2
Вот несколько ключевых особенностей Jetty:
1⃣ Легковесность: Jetty известен своей низкой потребностью в ресурсах и быстротой работы. Это делает его отличным выбором для приложений с ограниченными ресурсами или высокими требованиями к производительности.
2⃣ Встраиваемость: Jetty может быть легко встроен в приложение Java, что позволяет запускать веб-приложения без необходимости настройки и развертывания отдельного сервера. Это особенно удобно для микросервисных архитектур и встраивания сервера в приложение.
3⃣ Поддержка последних стандартов: Jetty активно разрабатывается и поддерживается, что означает, что он всегда совместим с последними версиями спецификации Java Servlet API и HTTP.
4⃣ Модульность: Jetty состоит из набора модулей, которые можно активировать или деактивировать в зависимости от потребностей приложения. Это позволяет оптимизировать использование ресурсов и минимизировать размер дистрибутива.
5⃣ Поддержка асинхронных операций: Jetty поддерживает асинхронные операции, что позволяет обрабатывать большое количество одновременных запросов без блокирования потоков.
6⃣ Интеграция с различными технологиями: Jetty интегрируется с различными фреймворками и технологиями, такими как WebSocket, HTTP/2, JMX, и многими другими.
📌 Jetty является популярным выбором для веб-приложений в Java-среде благодаря своей производительности, гибкости и надежности. Он используется во множестве проектов, начиная от небольших приложений и заканчивая крупными веб-сервисами.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2
В Stream API используйте
Если у вас есть поток, который может содержать большое количество элементов, не соответствующих вашим критериям, используйте
filter() перед map(), чтобы избежать ненужной обработки.Если у вас есть поток, который может содержать большое количество элементов, не соответствующих вашим критериям, используйте
filter() перед map(), чтобы избежать ненужной обработки. Это может улучшить производительность вашего кода.👍14🔥3
Guava: Google Core Libraries for Java
Guava — это набор общих библиотек Java от Google, который включает в себя новые типы коллекций (такие как multimap и multiset), неизменяемые коллекции, библиотеку графов и утилиты для параллелизма, ввода-вывода, хеширования, примитивов, строк и многого другого! Он широко используется в большинстве проектов Java в Google, а также во многих других компаниях.
Guava — это набор общих библиотек Java от Google, который включает в себя новые типы коллекций (такие как multimap и multiset), неизменяемые коллекции, библиотеку графов и утилиты для параллелизма, ввода-вывода, хеширования, примитивов, строк и многого другого! Он широко используется в большинстве проектов Java в Google, а также во многих других компаниях.
👍8⚡2
В Java 15 появилась возможность задать константу типа String состоящую из нескольких строк без использования конкатенации.
Мы можем использовать текстовые блоки, объявив строку с """ (три двойные кавычки).
Это, безусловно, самый удобный способ объявления многострочной строки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14👨💻2