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

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

✍️По всем вопросам: @Pascal4eg
Download Telegram
Конвертировать 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
Java 9 ввел важное изменение в структуру приложений — модульную систему Java (Java Platform Module System, JPMS). Эта система была внедрена для улучшения масштабируемости, обеспечения лучшей изоляции и повышения устойчивости приложений. Вот основные концепции модульной системы:

1️⃣ Модуль (Module): Модуль в Java представляет собой логическую группу пакетов, которая обеспечивает определенный уровень инкапсуляции. Модули позволяют явно определить, какие классы или пакеты являются открытыми для других модулей, а какие остаются внутренними (закрытыми).

2️⃣ Декларация модуля (Module Declaration): Файл module-info.java добавляется в корневой каталог модуля и содержит информацию о модуле, такую как его имя, зависимости от других модулей и экспортируемые пакеты.

3️⃣ Команды модулей (Module Commands): Java 9 ввела новые команды, связанные с модулями, такие как --module-path для указания пути к модульным файлам, и --module для запуска конкретного модуля.

4️⃣ Проекции модулей (Module Resolutions): Модульная система предоставляет новый механизм разрешения зависимостей между модулями, что делает управление зависимостями более эффективным.

5️⃣ Системные модули (System Modules): Java 9 включает ряд системных модулей, таких как java.base, java.sql, и другие, которые предоставляют основные библиотеки и функциональность.

Использование модульной системы в Java позволяет более четко определять зависимости и предоставляет механизмы для управления видимостью классов и пакетов. Это сделано с целью сделать код более чистым, безопасным и удобным для поддержки в больших проектах.
👍12🔥21🥰1👏1
XPath (XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML. В XPath используется компактный синтаксис, отличный от принятого в XML.

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

JXPath предоставляет API для обхода графов JavaBeans, DOM и других типов объектов с использованием синтаксиса XPath.

С помощью JXPath вы можете читать и записывать свойства JavaBeans, получать и устанавливать элементы массивов, коллекций, Map, различных объектов контекста в сервлетах и т. д. Другими словами, JXPath применяет концепции XPath к альтернативным объектным моделям.

При работе со сложными структурами данных, JXPath может здорово сократить код.
👍101🔥1🥰1
Объектно-ориентированное программирование (ООП) - это парадигма программирования, которая базируется на концепции "объектов". Она предоставляет способ организации кода, который позволяет разрабатывать более модульные, масштабируемые и легко поддерживаемые программы. Основными концепциями ООП являются классы, объекты, инкапсуляция, наследование и полиморфизм. Вот более подробное описание этих концепций:

1⃣ Классы и объекты: Класс - это шаблон или чертеж, описывающий структуру и поведение объекта. Объект - это экземпляр класса, который содержит данные и методы, определенные в этом классе. Классы служат для определения объектов, а объекты - для создания конкретных экземпляров.

2⃣ Инкапсуляция: Инкапсуляция - это механизм, который позволяет скрыть внутренние детали реализации класса от внешнего мира и предоставлять доступ только к необходимым данным и методам. Это делается с помощью модификаторов доступа, таких как private, protected и public.

3⃣ Наследование: Наследование позволяет создавать новые классы на основе существующих классов, наследуя их свойства и методы. Это способствует повторному использованию кода и созданию иерархии классов. Родительский класс называется базовым классом, а наследующий класс - производным.

4⃣ Полиморфизм: Полиморфизм означает способность объектов разных классов реагировать на одну и ту же операцию по-разному. Это может быть достигнуто с помощью перегрузки операторов, абстрактных классов и интерфейсов. Полиморфизм позволяет упростить обработку объектов разных типов и сделать код более гибким.

ООП способствует разделению ответственности в программе, облегчает ее сопровождение и расширение, а также повышает повторное использование кода. Часто используется в разработке больших и сложных приложений, где необходимо управлять множеством объектов и их взаимодействием. Популярные языки программирования, поддерживающие ООП, включают Java, C++, C#, Python, и многие другие.
👍113🔥2