Java | Фишки и трюки
7.21K subscribers
182 photos
29 videos
6 files
40 links
Java: примеры кода, интересные фишки и полезные трюки

Купить рекламу: https://telega.in/c/java_tips_and_tricks

✍️По всем вопросам: @Pascal4eg
Download Telegram
Weak Reference: Слабая связь с объектами

В мире Java, WeakReference - это мощный инструмент для управления памятью. Он позволяет создавать ссылки на объекты, которые могут быть автоматически удалены сборщиком мусора, если на них больше нет сильных ссылок (обычная ссылка на объект).

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

Пример использования WeakReference:
WeakReference<MyObject> weakRef = new WeakReference<>(new MyObject());
Когда не будет сильных ссылок на MyObject, сборщик мусора автоматически удалит его, освобождая память. Это помогает оптимизировать использование ресурсов и снижать риск утечек памяти.

WeakReference - это мощный инструмент для управления памятью в Java, и его следует использовать там, где это необходимо для обеспечения эффективного управления ресурсами.
#WeakReference #УправлениеПамятью
9🥰2
🛠️ Системы сборки в мире Java — это незаменимые инструменты, которые делают процесс разработки проще и эффективнее.

Что бы ваш код стал работающим приложением, его нужно собрать в файл который можно запустить. Это может быть .war или .jar файл.

1️⃣ Apache Ant: Ant — это классическая система сборки Java, основанная на XML. Она обеспечивает гибкость и контроль над процессом сборки, но требует более подробной настройки в сравнении с Maven и Gradle. Считается устаревшей и практически не используется в современных проектах.

2️⃣ Apache Maven: Эта система сборки известна своей конфигурацией на основе управляемых проектов (POM), что упрощает управление зависимостями и сборку проектов. Maven также предоставляет обширную базу плагинов, которые облегчают автоматизацию различных задач. Конфигурация происходит в pom.xml файлах, соответственно в xml формате. На данный момент является наиболее распространенной системой сборки.

3️⃣ Gradle: Gradle предоставляет гибкую и мощную систему сборки с использованием Groovy DSL. Он позволяет разработчикам определять собственные задачи сборки и легко интегрировать их в проект. Gradle также поддерживает инкрементную сборку, что ускоряет разработку. Считается более современной системой по сравнении с Apache Maven и новые проекты часто создаются с использованием этой системы сборки.

Выбор системы сборки зависит от ваших потребностей и предпочтений. Независимо от того, какую вы выберете, они все помогут упростить и ускорить ваш процесс разработки на Java.
👍14🐳3
⌨️ Nashorn 🦏 — это движок JavaScript, разработанный на языке программирования Java первоначально Oracle, а затем сообществом OpenJDK. Nashorn был включен в JDK в версии Java 8 и до Java 14. С Java 15 его нужно подключать явно.

Исполнение JavaScript кода внутри Java приложения может быть полезным по нескольким причинам:

1⃣ Расширяемость: Вы можете использовать JavaScript для динамического настраиваемого поведения вашего Java приложения. Это позволяет легко добавлять и изменять функциональность без необходимости перекомпилировать и пересобирать код Java.

2⃣ Переиспользование кода: Если у вас уже есть существующий JavaScript код, его можно легко интегрировать в Java приложение, чтобы не создавать аналогичную функциональность на Java.

3⃣ Использование библиотек: JavaScript имеет богатую экосистему библиотек и фреймворков, которые могут быть полезными для решения определенных задач. Вы можете использовать их внутри Java приложения, чтобы ускорить разработку и добавить новые возможности.

Из кода Java в JavaScript можно передать данные, а так же получить обратно. Так же в JavaScript можно использовать Java классы.

📌 Однако следует помнить, что интеграция JavaScript и Java может вызвать сложности с обработкой ошибок, безопасностью и отладкой. Также, перед использованием JavaScript в Java приложении, стоит оценить, действительно ли это необходимо, и рассмотреть альтернативные способы решения задачи.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🦄4
Optional представляет собой класс, введенный в Java 8, который предназначен для борьбы с проблемами, связанными с отсутствием значения (null) и обеспечивает более безопасную и чистую обработку возможных отсутствующих значений.

Вот некоторые основные концепции и преимущества, связанные с Optional:

1⃣ Избавление от NullPointerException: Одной из основных задач Optional является предотвращение NullPointerException, которые могут возникнуть, когда мы пытаемся обратиться к методам или полям объекта, который оказывается null.

2⃣ Явное указание на отсутствие значения: Optional позволяет явно указать, что значение может быть отсутствующим, и предоставляет методы для проверки и обработки этого случая.

3⃣ Безопасные методы доступа к данным: Вместо того чтобы напрямую получать доступ к данным внутри Optional, мы используем методы, такие как isPresent(), ifPresent(), orElse(), orElseGet(), orElseThrow(), которые позволяют выполнить определенные действия, если значение присутствует, или вернуть альтернативное значение, если оно отсутствует.

Использование Optional способствует более чистому и читаемому коду, а также снижает вероятность ошибок, связанных с нулевыми значениями. Однако следует помнить, что Optional не всегда является наилучшим выбором, и его следует использовать там, где это имеет смысл с точки зрения бизнес-логики вашего приложения.
👍63
volatile - это ключевое слово, которое может быть применено к переменным. Ключевое слово volatile играет важную роль в управлении видимостью и синхронизацией данных между потоками. Когда переменная объявлена как volatile, это означает, что операции чтения и записи этой переменной будут синхронизированы между потоками.

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

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

📌 volatile является мощным механизмом для обеспечения видимости изменений переменных между потоками без использования блокировок. Однако его следует использовать с осторожностью и только тогда, когда это действительно необходимо, так как в большинстве случаев синхронизация с использованием synchronized или java.util.concurrent библиотеки может быть более подходящим вариантом.
💯6👍3
⌨️ Инициализация это процесс задания начальных значений переменным и объектам перед их использованием. Этот процесс необходим для того, чтобы обеспечить корректное начальное состояние переменных и объектов в программе.

Порядок инициализации

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 использует существующий экземпляр строки, иначе создает новый и добавляет его в пул строк.

Интернирование строк выполняется с использованием метода 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 представляет собой ценный инструмент для управления изменениями в базе данных, который способствует снижению рисков и упрощению развертывания приложений, работающих с базами данных.
5🍓2👍1
🔁 Рекурсия — определение, описание, изображение какого-либо объекта или процесса внутри самого этого объекта или процесса, то есть ситуация, когда объект является частью самого себя.

В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия).

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

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

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

Аргумент JVM -Xss задаёт размер стэка. Например, -Xss2048k задает размер стека 2 МБ.
🔥5🤩2👍1
Programmers while reviewing the codes
😁17😱1
🍝 Спагетти-код: когда разработка становится беспорядком

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

Почему спагетти-код возникает?

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 избавит вас от написания безаргументных конструкторов, методов toString(), equals() и hashCode(), для этого нужно просто добавить несколько аннотаций. Плюс, эта библиотека подключается прямо к вашей IDE, поэтому работа воспринимается так, словно вы написали весь шаблонный код сами.

Преимущества Lombok

Уменьшение кода: С Lombok вы можете создавать классы с минимальным количеством шаблонного кода. Это уменьшает вероятность ошибок и сокращает объем написанного текста.

Читаемость: Уменьшение количества шума в коде делает его более читаемым и понятным.

Производительность: Lombok ускоряет процесс разработки, так как не нужно тратить время на написание рутиных методов.

Совместимость: Lombok совместим с различными интегрированными средами разработки (IDE) и средами сборки проектов.

Аннотация @Data генерирует геттеры, сеттеры, toString(), equals() и hashCode(), что позволяет вам сосредотачиваться на бизнес-логике вашего приложения, а не на шаблонном коде.

Если вы хотите упростить разработку и сэкономить массу времени и усилий, то Lombok - отличный инструмент для вас. Он помогает уменьшить рутиный код и улучшить читаемость вашего проекта. Попробуйте Lombok в своем следующем проекте и оцените его удивительные преимущества!
👍15🔥3🤩1😍1
Множественное присваивание

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

Операция присваивания может иметь вид цепочки:
переменная1 = переменная2 = выражение;

В этом случае алгоритм выполнения следующий:
- сначала вычисляется значение выражения;
- результат вычисления выражения присваивается в переменную2;
- результат вычисления выражения присваивается в переменную1.

Цепочка (последовательность) из операций присваивания может содержать произвольное количество присваиваний.
👍7🤩1🍾1
Тернарный оператор (также известный как условный оператор) - это сокращенная форма записи условного выражения.

Он имеет следующий синтаксис:
условие ? значение_если_истина : значение_если_ложь;

В данном операторе условие - это выражение, которое вычисляется как true или false, и в зависимости от его значения возвращается либо значение_если_истина, либо значение_если_ложь.

Тернарный оператор часто используется для компактного присвоения значений переменным на основе условий. Пример:
int max = (a > b) ? a : b;

Такой оператор удобен для упрощения кода и уменьшения его объема, когда необходимо выбирать между двумя значениями в зависимости от условия.
😁7👍2🙏1🤣1
🤣15😁52🥱1
Константы в Java

В Java нет специального ключевого слова для определения константы как в других языках.

Константа в языке Java реализована комбинацией двух ключевых слов: static и final.

static означает, что значение принадлежит классу. А final разрешает присвоить переменной значение только один раз.
👍11👨‍💻2👎1🤔1
SerialVersionUID - это private static final поле типа long класса который реализует интерфейс Serializable.

Во время сериализации, если мы не объявляем SerialVersionUID в нашем классе, среда выполнения Java создает номер версии для класса, так что она может десереализировать его позже. Если во время десериализации, SerialVersionUID не соответствует, то процесс завершится с исключением InvalidClassException.

Процесс создания номера версии Jav'ой чувствителен ко многим метаданным класса включая количество полей, тип полей, модификаторы доступа полей, интерфейсов, которые реализованы в классе и прочего.

Лучшая практика в сериализации – это явно объявить SerialVersionUID, чтобы избежать любых проблем при де-сериализации, особенно если вы работаете с клиент-серверным приложением, которое опирается на сериализованные данные, например, RMI.

Под сериализацией здесь понимается только стандартный механизм Java (ObjectInputStream, ObjectOutputStream).
👍6🔥2
⌨️ JTwig - это библиотека шаблонизации для языка программирования Java. Она предоставляет удобный способ создания и обработки шаблонов для генерации текстового или HTML-кода. JTwig особенно полезен, когда вам нужно создавать динамические страницы в веб-приложениях, генерировать отчеты, email-рассылки или форматировать текстовый вывод.

Основные особенности 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 (New I/O) — это набор функциональных возможностей для работы с вводом и выводом данных (I/O), представленный в Java 1.4. Этот набор функций предоставляет более эффективный и мощный способ обработки операций ввода-вывода по сравнению с традиционным I/O API, известным как Java IO (или Java I/O).

Вот основные компоненты 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