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

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

✍️По всем вопросам: @Pascal4eg
Download Telegram
🍝 Спагетти-код: когда разработка становится беспорядком

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

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

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
⌨️ Jetty - это встраиваемый веб-сервер и контейнер сервлетов, разрабатываемый Eclipse Foundation. Jetty предоставляет компактное и легковесное решение для обработки HTTP-запросов и запуска веб-приложений в среде Java. Он широко используется в индустрии веб-разработки и часто встречается в различных проектах и приложениях, где требуется встроенный сервер.

Вот несколько ключевых особенностей 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
😁18🤣53
В Stream API используйте filter() перед map(), чтобы избежать ненужной обработки.

Если у вас есть поток, который может содержать большое количество элементов, не соответствующих вашим критериям, используйте filter() перед map(), чтобы избежать ненужной обработки. Это может улучшить производительность вашего кода.
👍14🔥3
Guava: Google Core Libraries for Java

Guava — это набор общих библиотек Java от Google, который включает в себя новые типы коллекций (такие как multimap и multiset), неизменяемые коллекции, библиотеку графов и утилиты для параллелизма, ввода-вывода, хеширования, примитивов, строк и многого другого! Он широко используется в большинстве проектов Java в Google, а также во многих других компаниях.
👍82
⌨️ Text Blocks (Текстовые блоки)

В Java 15 появилась возможность задать константу типа String состоящую из нескольких строк без использования конкатенации.

Мы можем использовать текстовые блоки, объявив строку с """ (три двойные кавычки).

Это, безусловно, самый удобный способ объявления многострочной строки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14👨‍💻2
Switch-выражения

Чтобы получить значение из switch-выражения, раньше приходилось создавать отдельную переменную и постоянно использовать break;.

В Java 14 появился новый формат записи, который помогает получать результат выбора и записывать выражение компактнее.

Если перечислены все возможные варианты, ветка default теперь не нужна.

Если в значение (case) нужно записать выражение, его заключают в фигурные скобки {} и для возврата значения используют ключевое слово yield.
👍10💯41
⌨️ try-with-resources

Благодаря конструкции "try-with-resources" вы можете элегантно и безопасно управлять ресурсами, такими как потоки, сокеты или другие объекты, требующие явного закрытия после использования. Это улучшение ввода-вывода позволяет автоматически закрывать открытые ресурсы после завершения блока try.

В блоке try может быть открыто несколько ресурсов и соответственно объявлено несколько переменных указывающих на них. Классы этих переменных должны реализовать интерфейс AutoCloseable.

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

try-with-resources доступен начиная с Java 7 и предоставляет удобный способ для обработки ресурсов и исключений, связанных с ними.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤓1🙈1
Netty - это мощный и высокопроизводительный фреймворк для разработки сетевых приложений на языке Java. Он предоставляет асинхронное и событийно-ориентированное программирование для создания масштабируемых сетевых приложений, таких как серверы, прокси, клиенты и другие.

Вот некоторые ключевые особенности Netty:

1⃣ Асинхронная и событийно-ориентированная модель: Netty предоставляет асинхронные API, которые позволяют обрабатывать большое количество одновременных соединений без блокирования. Событийно-ориентированный подход позволяет легко реагировать на различные события, такие как подключение клиента, чтение данных или отправка данных.

2⃣ Мультиплексирование: Netty поддерживает мультиплексирование, что позволяет обрабатывать множество соединений на одном потоке, что повышает производительность.

3⃣ Поддержка различных протоколов: Netty имеет гибкую архитектуру и поддерживает различные протоколы, такие как HTTP, WebSocket, TCP, UDP, SSL и многие другие.

4⃣ Высокая производительность: Netty разработан с акцентом на производительность и масштабируемость. Он широко используется в крупных сетевых приложениях, включая веб-серверы, чаты, игры и финансовые приложения.

5⃣ Простота использования: Несмотря на высокую производительность, Netty предоставляет чистый и интуитивно понятный API, который облегчает создание сетевых приложений.

6⃣ Поддержка технологий Java NIO и epoll: Netty использует возможности Java NIO и, в случае операционных систем, поддерживающих epoll, позволяет эффективно использовать их для оптимизации работы с сетью.

7⃣ Сообщество и документация: Netty имеет активное сообщество и обширную документацию, что делает его доступным для разработчиков и обеспечивает поддержку и обновления.

Netty является отличным выбором для разработчиков, которые хотят создавать высокопроизводительные и надежные сетевые приложения на платформе Java.
👍7😁21
😁16🤣7
⌨️ HashMap - это реализация интерфейса Map, которая представляет собой структуру данных, которая позволяет хранить пары ключ-значение и обеспечивает эффективный доступ к значениям по ключу. HashMap основан на хеш-таблице, что позволяет достигать высокой производительности при операциях вставки, удаления и поиска элементов. Вот как это работает:

1⃣ Вставка элемента:
При вставке элемента в HashMap, вы передаете ключ и значение. Сначала вычисляется хеш-код ключа с использованием метода hashCode(). Затем этот хеш-код преобразуется в индекс внутреннего массива (бакета) с помощью функции хеширования (обычно путем выполнения операции % на размере массива). Если в соответствующем бакете уже есть элементы, то новый элемент может быть добавлен в виде связанного списка или более сложной структуры данных, в зависимости от реализации HashMap.

2⃣ Поиск элемента:
Для поиска значения по ключу, вы передаете ключ методу get(). Здесь снова вычисляется хеш-код ключа и определяется индекс бакета. Затем HashMap проверяет все элементы в этом бакете, чтобы найти соответствующий ключ. Если есть несколько элементов с одинаковым хеш-кодом (коллизия), они могут быть проверены последовательно, пока не будет найден элемент с соответствующим ключом.

3⃣ Удаление элемента:
При удалении элемента по ключу, HashMap также вычисляет хеш-код ключа и находит соответствующий бакет. Затем элемент удаляется из этого бакета. Если в бакете есть несколько элементов, они могут быть перебраны для поиска правильного элемента.

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

HashMap также автоматически увеличивает свою емкость, когда количество элементов в нем превышает определенный порог, чтобы уменьшить вероятность коллизий и сохранить высокую производительность.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16💩2👏1🤮1
Внедрение зависимостей (Dependency Injection) — это шаблон проектирования, который способствует слабой связи между компонентами системы. С помощью внедрения зависимостей вы можете внедрять зависимости в класс вместо того, чтобы создавать их внутри класса, что снижает сложность и зависимости вашего кода.

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

Библиотек для внедрения зависимостей существует огромное множество, например: Dagger2, Guice, Weld. Ну и конечно в популярном фреймворке Spring так же есть встроенная поддержка dependency injection.
👍5🔥3
Default Methods in Interfaces

В отличие от обычных методов интерфейса, мы объявляем их с ключевым словом default в начале сигнатуры метода, и они предоставляют реализацию.

Причина, по которой в версию Java 8 включены методы по умолчанию, довольно очевидна.
В типичном проекте, основанном на абстракциях, где интерфейс имеет одну или несколько реализаций, если к интерфейсу добавляется один или несколько методов, все реализации также будут вынуждены их реализовать. В противном случае конструкция просто сломается.

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

Таким образом, обратная совместимость аккуратно сохраняется без необходимости рефакторинга разработчиков.

На первый взгляд эта функция может показаться немного небрежной, особенно с точки зрения объектно-ориентированного теоретика. В идеале интерфейсы не должны инкапсулировать поведение, и мы должны использовать их только для определения общедоступного API определенного типа.

Однако когда дело доходит до обеспечения обратной совместимости с существующим кодом, методы по умолчанию являются хорошим компромиссом.
👍7🔥2🤔1