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

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

✍️По всем вопросам: @Pascal4eg
Download Telegram
Forwarded from Цитата дня
🔥123😢3👨‍💻2🤡1
@Value Spring annotation

Эту аннотацию можно использовать для ввода значений в поля в bean-компонентах, управляемых Spring, и ее можно применять на уровне поля или параметра конструктора/метода.

Заполним наш application.properties файл:
value.from.file=Value got from the file
priority=high
listOfValues=A,B,C


Первый и самый бесполезный вариант использования это указать просто строку в аннотации @Value, эта строка и установится как значение аннотируемого члена класса.

Используя конструкцию ${propname} в аннотации, можно получить значение из конфигурационного файла приложения или переменной окружения.

Если значения может не быть, то можно определить значение по умолчанию ${unknown.param:some default}, если этого не сделать, то получим ошибку java.lang.IllegalArgumentException: Could not resolve placeholder 'unknown.param' in value "${unknown.param}"
👍5🔥3
💎 Запуск java приложения в Docker

Для запуска приложения в докере понадобится установленный Docker и приложение собранное в jar файл.

Для создания docker образа (image), на основе которого будет создаваться контейнер с вашим приложением, нужен файл с именем Dockerfile.

В этом файле должны быть 3 простые директивы:

FROM: указывает родительский образ, из которого мы создаем свой.

ADD: копируем jar файл внутрь образа

ENTRYPOINT: запуск команды после старта контейнера

Далее нужно собрать образ командой:
docker build -t my-java-app .

И запустить контейнер на основе созданного образа:
docker run -p 8080:8080 my-java-app

Эта команда запустит контейнер, привяжет порт 8080 в контейнере к порту 8080 на хосте и запустит ваше Java-приложение внутри контейнера.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍6🐳5
QueryDSL — это мощный и чрезвычайно гибкий инструмент для работы с БД и просто подарок для Java-разработчиков, которые не очень хорошо разбираются в SQL (или совсем не разбираются), поскольку позволяет работать с БД при помощи привычного объектного представления сущностных зависимостей.

Querydsl был создан как замена громоздкого и многословного Criteria Query API.

Достоинства:

👉 типобезопасные запросы

👉 статическая проверка запросов
👍20👌1
Конвертировать InputStream в String

В Java-приложениях довольно часто требуется получить строку из входного потока, полученного, например, из файла или по сети.
🔥7👍3👎1
Часто в Java-приложении есть необходимость хранить файлы. И если приложение состоит из нескольких микросервисов, которым нужен доступ к файлам, то не обойтись без централизованного файлового хранилища. Одним из таких хранилищ является MinIO.

MinIO - это open source хранилище данных, совместимое с Amazon S3. Он обеспечивает отказоустойчивость, масштабируемость, шифрование данных и предоставляет богатые клиентские библиотеки для интеграции в приложения.

MinIO становится популярным выбором для хранения и управления данными благодаря своей гибкости и совместимости с Amazon S3, что делает его подходящим для широкого спектра приложений, от простых хранилищ данных до сложных облачных сценариев.
👍6🔥3🤗1
ACID (Atomicity, Consistency, Isolation, Durability) - это набор свойств, которые определяют стандарты для транзакций в базах данных. Эти свойства обеспечивают надежность и целостность данных в базе данных, даже в случае сбоев системы или непредвиденных ситуаций. Давайте рассмотрим каждое из этих свойств более подробно:

1⃣ Атомарность (Atomicity): Это свойство гарантирует, что транзакция будет выполнена полностью или не будет выполнена вовсе. Она является неделимой единицей работы, и либо все её операции будут успешно завершены, либо ни одна из них. Если хотя бы одна операция в транзакции завершится неудачно, все изменения, внесенные этой транзакцией, будут отменены (откат).

2⃣ Согласованность (Consistency): Это свойство обеспечивает, что только допустимые данные могут быть записаны в базу данных. Транзакция не должна нарушать целостность данных и бизнес-правила. Если транзакция приводит к недопустимому состоянию данных, она будет отменена.

3⃣ Изолированность (Isolation): Изоляция гарантирует, что одна транзакция не влияет на другие транзакции, выполняющиеся параллельно. То есть, каждая транзакция должна работать так, как будто она выполняется в изоляции от других транзакций. Это предотвращает конфликты и гарантирует, что данные не будут испорчены параллельными операциями.

4⃣ Долговечность (Durability): Долговечность означает, что изменения, внесенные в базу данных в рамках успешно завершенной транзакции, должны быть сохранены даже в случае сбоя системы или перезапуска. Другими словами, данные, записанные в базу данных, должны быть стойкими к сбоям и не должны теряться.

📌 Соблюдение этих четырех принципов ACID является критически важным для обеспечения надежности и целостности данных в системах управления базами данных (СУБД). Эти принципы позволяют гарантировать, что даже в сложных сценариях, таких как сбои системы или конфликты параллельных транзакций, данные останутся в согласованном и надежном состоянии.
👍15🆒21🔥1
Скачать файл используя Java NIO

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

Чтобы прочитать файл по нашему URL-адресу, мы создадим новый ReadableByteChannel из потока URL-адреса.

Байты, прочитанные из ReadableByteChannel, будут переданы в FileChannel, соответствующий загружаемому файлу.

Используем метод transferFrom() из класса ReadableByteChannel для загрузки байтов с заданного URL-адреса в наш FileChannel.

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

В системах Linux и UNIX эти методы используют метод нулевого копирования, который уменьшает количество переключений контекста между режимом ядра и пользовательским режимом.
👍15🔥1
StringJoiner - это класс, который предназначен для объединения строк с использованием разделителя между ними. Этот класс был введен в Java 8 в пакете java.util. Он облегчает создание текстовых последовательностей, объединяя строки и вставляя разделители между ними.

Вызов метода toString() возвращает объединенную строку с разделителями и окружающими символами.

Вы также можете использовать метод setEmptyValue() для определения значения, которое будет использоваться, если StringJoiner остается пустым.
👍153🔥1
Способы передачи параметров

В языках программирования существует два основных способа передачи параметров в методы (или функции) — "по значению" и "по ссылке". Эти методы определяют, каким образом изменения, внесенные в параметр внутри метода, влияют на исходное значение аргумента, переданного методу. Рассмотрим оба способа более подробно.

1⃣ Передача параметра "по значению" (pass-by-value):
В этом способе исходное значение параметра не изменяется внутри метода. Метод работает с копией значения параметра. Это означает, что любые изменения, внесенные в параметр внутри метода, не отразятся на исходном значении, переданном методу. Параметры передаются "по значению" в большинстве простых типов данных.

2⃣ Передача параметра "по ссылке" (pass-by-reference):
В этом случае метод получает не копию значения параметра, а ссылку на сам объект или переменную. Если метод изменяет значение параметра, это изменение отразится на исходном объекте или переменной, переданной методу. Параметры передаются "по ссылке" в языках программирования, поддерживающих ссылки на объекты, как например в языке C++ с использованием указателей.

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

В Java передача всегда происходит "по значению", то есть содержимое переменной копируется при передаче в метод. Но важно понимать, что при передаче переменной ссылочного типа (любой не примитивный тип), скопируется именно ссылка на объект (а не сам объект) и соответственно в методе можно поменять сам исходный (переданный) объект.
👍10🔥3
Что выведет приложение?
Anonymous Quiz
19%
13
21%
012
11%
112
19%
0123
31%
03
👍8🏆4🥰3
Forwarded from Цитата дня
👍16🔥4🤗2
🤣20😁72
Принцип программирования KISS - это акроним, который расшифровывается как "Keep It Simple, Stupid" или более корректно "Keep It Short and Simple". Этот принцип представляет собой философию, которая подразумевает, что программное обеспечение должно быть создано и поддерживаться с максимальной простотой, чтобы быть более надежным, легко понимаемым и легко изменяемым.

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

Принцип KISS часто связывают с другими принципами разработки, такими как "Принцип YAGNI" (You Ain't Gonna Need It), который призывает избегать добавления функций, которые пока не являются необходимыми, и "Принцип Occam's Razor", который гласит, что "простейшее объяснение, как правило, является наилучшим". Эти принципы способствуют созданию более чистого, эффективного и понятного кода.
👍12🔥43
Arrays.toString() и Arrays.deepToString()

В Java массивы не переопределяют toString(), поэтому, если вы попытаетесь напечатать его напрямую, вы получите имя класса + '@' + шестнадцатеричный хеш-код массива, как определено в Object.toString().

Но обычно нам на самом деле нужно что бы напечаталось содержимое массива. Самый простой способ это сделать, это воспользоваться методом Arrays.toString(). А если массив содержит другие массивы, то Arrays.deepToString().

Внутри этих методов на каждом элементе массива вызывается метод toString() для получения строкового представления.
👍24🔥4👌3
Immutable Classes (неизменяемые классы)

Неизменяемость — это характеристика объектов Java, которая делает их неизменными для будущих изменений после их инициализации. Его внутреннее состояние невозможно никак изменить. Чтобы изменить состояние, мы должны создать новую копию такого объекта с предполагаемыми изменениями.

Возьмем пример класса java.lang.String, который является неизменяемым классом. После создания строки мы не сможем изменить содержимое этой строки. Каждый общедоступный API в классе String возвращает новую строку с измененным содержимым. Исходная строка всегда остается неизменной.

Рекомендации по созданию неизменяемых классов:

⌨️ Не определять сеттеров. Сеттеры предназначены для изменения состояния объекта, которое мы здесь хотим предотвратить.

⌨️ Сделайте все поля final и private. Поля, объявленные private, не будут доступны за пределами класса, и если сделать их final, мы не сможем изменить их даже случайно.

⌨️ Не позволяйте подклассам переопределять методы. Самый простой способ — объявить класс как final. final классы не могут быть расширены.

⌨️ Особое внимание "неизменяемым классам с изменяемыми полями". Всегда помните, что поля-члены могут быть либо изменяемыми, либо неизменяемыми. Значения неизменяемых членов (примитивы, классы-обёртки, строки и т. д.) могут быть безопасно возвращены из геттеров. Для изменяемых членов (POJO, коллекций и т. д.) мы должны скопировать содержимое в новый объект перед возвратом из геттера.

Некоторые неизменяемые классы из JDK:
👉 String
👉 Integer, Long, Double и другие обёртки
👉 BigInteger, BigDecimal
👉 enum
👉 record
👉 LocalDate, LocalTime и другие классы Java 8 Date Time API
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥5
Apache POI представляет собой API, который позволяет использовать файлы MS Office в Java приложениях. Данная библиотека разрабатывается и распространяется Apache Software Foundation и носит открытый характер. Apache POI включает классы и методы для чтения и записи информации в документы MS Office.
👍13🔥2
Класс Scanner представляет собой инструмент для считывания данных из различных источников, таких как стандартный ввод (клавиатура), файлы и строки. Он является частью пакета java.util, и используется для обработки ввода данных в приложениях.

Основные методы и возможности класса Scanner включают:

1️⃣ Считывание различных типов данных: nextInt(), nextLong(), nextDouble() считывают числа, а next() и nextLine() считывают строки.

2️⃣ Управление разделителями: метод useDelimiter(String pattern) позволяет настроить пользовательский разделитель для ввода, по умолчанию Scanner использует пробелы как разделители.

3️⃣ Проверка наличия данных: методы hasNextInt(), hasNextDouble(), hasNext() позволяют проверить наличие следующего значения определенного типа во входных данных.

4️⃣ Обработка исключений: методы nextInt(), nextDouble() и другие могут вызвать исключения типа InputMismatchException, если ввод не соответствует ожидаемому типу данных.

Класс Scanner позволяет удобно считывать и обрабатывать ввод от пользователя или из файлов, что делает его полезным инструментом при создании интерактивных приложений и обработке входных данных.
👍18🔥4👌1
В Java цикл for-each позволяет перебирать элементы массивов, коллекций и других итерируемых объектов без необходимости использовать индексы или итераторы. Однако, для того чтобы вы могли использовать for-each для перебора элементов своего собственного класса, этот класс должен реализовать интерфейс Iterable и предоставить метод iterator(), возвращающий объект, реализующий интерфейс Iterator.

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

Вы можете адаптировать этот пример для своих собственных классов, реализуя интерфейс Iterable и предоставив соответствующий итератор, чтобы использовать for-each для вашего класса.
👍20👏2
Наследование конструкторов

В Java конструкторы не наследуются в том смысле, в котором наследуются методы и поля. Конструкторы - это специальные методы, используемые для инициализации объектов класса, и они не наследуются автоматически от суперкласса.

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

Таким образом, если вы хотите в подклассе сохранить все конструкторы суперкласса, то их нужно явно объявить в подклассе.
👍14🔥1👏1