Telegram Web Link
🖥 Infinity For Reddit

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

Содержит такие функции, как Lazy Mode (автоматическая прокрутка сообщений), поддержка нескольких учетных записей и ночная тема.

Github
Docs

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 PostgreSQL JDBC Driver

Драйвер PostgreSQL JDBC Driver (сокращенно PgJDBC) позволяет Java-программам подключаться к базе данных PostgreSQL, используя стандартный, независимый от базы данных Java-код. Это JDBC-драйвер с открытым исходным кодом, написанный на языке Pure Java (Type 4) и взаимодействующий в сетевом протоколе PostgreSQL.

Github
Docs

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🎮 Как уменьшить объем шаблонного кода в тестах Kotlin

Тестирование должно быть простым.

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

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

Сценарий использования
Допустим, у нас есть приложение, которое отправляет какие-либо данные принимающему API. Отправляем следующее:
data class Stuff(val name: String, val type: String)

Сервис перенаправляет запрос другому классу для фактической отправки. Код выглядит так:
import okhttp3.OkHttpClient

class StuffService() {
private val client = OkHttpClient()
.newBuilder()
.addInterceptor { chain ->
val request = chain.request().newBuilder()
.addHeader("Content-Type", "application/json")
.build()
chain.proceed(request)
}.build()

private val stuffLink = StuffLink(client, "http://some.where")

fun sendStuff(stuff: Stuff) = stuffLink.sendStuff(stuff)
}


Клиент (назовем его ссылкой, тем самым исключая множественные трактовки этого понятия) выполняет фактическую отправку, создавая запрос и отправляя его посредством заданного OkHttpClient и URL. Рассмотрим код:

import com.fasterxml.jackson.databind.ObjectMapper
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response

class StuffLink(private val client: OkHttpClient, private val url: String) {
private val objectMapper = ObjectMapper()

fun sendStuff(stuff: Stuff): Response {
val request = Request.Builder()
.url(url)
.post(
objectMapper.writeValueAsString(stuff)
.toRequestBody("application/json".toMediaType()),
).build()

return client.newCall(request).execute()
}
}


Вариант теста 1

🔎 Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 ​Что такое object в Kotlin

Известно, что в Kotlin объекты создаются с помощью конструкторов. Но это не единственный способ!

В этой статье вы узнаете о двух альтернативах: object expressions и object declarations.

📌Читать

#android

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 HertzBeat

HertzBeat - это система мониторинга с открытым исходным кодом, работающая в режиме реального времени, с пользовательским мониторингом, высокопроизводительным кластером и возможностью работы без агентов.

Github

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Дайджест полезных материалов из мира : Java за неделю

Почитать:
Модельно-Ориентированная Java, или Навстречу Дизайну ПО
Искусство ETL. Пишем собственный движок SQL на Spark [часть 4 из 5]
Как внедрить Prototype в Singleton в Spring с помощью параметра ProxyMode
Искусство ETL. Пишем собственный движок SQL на Spark [часть 3 из 5]
Делаем свою простейшую систему сборки для Java
Микросмартфон за 100 рублей: Покупаем смартфон 11-летней давности и… пишем под него приложения
Искусство ETL. Пишем собственный движок SQL на Spark [часть 2 из 5]
Ad-hoc мониторинг: сбор, хранение и визуализация данных
Искусство ETL. Пишем собственный движок SQL на Spark [часть 1 из 5]
Разница между Data Race и Race Condition
Solving "All Nodes Distance K in Binary Tree" Leet code Question
Mutex & Race Conditions in Java Multi-Threading made so simple with real-life analogies
Hash! A magical datastructure
"I definitely didn't spend 3 hours on this question..😢#BinaryTreeAdventures" Solving Binary Tree Right Side View Leet code
Leet Code 75–2215. Find the Difference of Two Arrays
Multi-Threading in JAVA using Callables
convertTxtToHtml - A new command-line tool can process .txt files into .html
Java Interfaces Default Methods
Iniciando estudos em Kotlin
Common Mistakes of Junior Java Developers When Working with Hibernate

Посмотреть:
🌐 Java 21 API New Features #RoadTo21 ( 16:48)
🌐 #Java 21 bug fixes you need to know about ( 00:54)
🌐 What is the difference between a Collection and a List? - Cracking the Java Coding Interview ( 00:58)
🌐 Difference between toList() and Collectors.toList()? - Cracking the Java Coding Interview ( 01:00)
🌐 Java 21 Security Updates #RoadTo21 ( 27:04)
🌐 JVM Language Summit 2023 Keynote #JVMLS ( 21:15)
🌐 Java 21 Launch Event ( 00:00)

Хорошего дня!

@javatg
🏛Событийно-ориентированная архитектура

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

Преимущества событийно-ориентированной архитектуры
▪️Слабая связанность: службы разделены, чем обеспечивается независимость и модульность.
▪️Масштабируемость: службы масштабируются независимо, исходя из потребности в событиях, чем повышается общая производительность системы.
▪️Асинхронная обработка: событиями обеспечиваются асинхронное взаимодействие, уменьшение задержки и времени отклика.
▪️Порождение событий: поддерживается естественным образом, ведь состояние системы определяется последовательностью прошлых событий.
▪️Гибкость: добавление новых служб или изменение имеющихся не сказывается на всей системе.

Kafka

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

В основе Kafka — модель обмена сообщениями «публикация-подписка», где в темах отправителями публикуются сообщения-события, а получатели — для получения и обработки сообщений — подписываются на эти темы. События хранятся в Kafka неизменяемо и только с возможностью добавления. Данные обрабатываются как в реальном времени, так и ретроспективе.

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

Роль Kafka в событийно-ориентированной архитектуре

📌 Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉🎉🎉 Релиз Java 21 🎉🎉🎉

Новые функций:
• виртуальные потоки
• record Patterns
• pattern Matching для switch
• новые методы в коллекциях
• интерполяция строк и другие интересные нововведения.

Релиз
Трансляция

👍 лайк, если ждал новую версию

@javatg
🖇 Создание глубокой и поверхностной копии объекта.
Java Stream API: когда использовать map() и FlatMap()

При работе с объектами в Java бывают случаи, когда вам необходимо создать копию объекта. Однако не все копии одинаковы. Существует два основных способа копирования объектов: глубокое копирование (Deep Copy) и поверхностное копирование (Shallow Copy).

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

Поверхностное копирование: в чем разница?
С другой стороны, поверхностное копирование создает копию объекта, не зная о структуре класса, который он копирует. То есть, объект копируется без содержащихся в нем вложенных объектов. По умолчанию в Java применяется поверхностное копирование. Для этого используется метод clone().

Давайте применим копирование на практике: пример фигур
Представьте, что у вас есть класс с именем Circle, в котором есть вложенный объект класса Point, представляющий его центр. Сейчас мы увидим, как глубокое и поверхностное копирование работают с этими объектами.

public class Circle {
public Point center;
public int radius;

public Circle(Point center, int radius) {
this.center = center;
this.radius = radius;
}
}

public class Point {
public int x, y;

public Point(int x, int y) {
this.x = x;
this.y = y;
}
}

Создание поверхностной копии
Для поверхностного копирования мы просто копируем ссылки на вложенные объекты:

public Circle shallowCopyCircle(Circle original) {
return new Circle(original.center, original.radius);
}


Создание глубокой копии
ля глубокой копии Circle нам нужно создать новые экземпляры объектов Point и Circle.

public Circle deepCopyCircle(Circle original) {
Point copiedPoint = new Point(original.center.x, original.center.y);
return new Circle(copiedPoint, original.radius);
}


Создание простого класса CopyUtil
Вот класс утилиты с кодом копирования объектов:

public class CopyUtil {
public Circle deepCopyCircle(Circle original) {
Point copiedPoint = new Point(original.center.x, original.center.y);
return new Circle(copiedPoint, original.radius);
}
public Circle shallowCopyCircle(Circle original) {
return new Circle(original.center, original.radius);
}
}


Модульные тесты
Давайте напишем несколько простых тестов для проверки наших методов глубокого и поверхностного копирования.

📌 Продолжение

@javatg
🖥 Бесплатный курс: Learn Dynamic Programming Techniques in Java

Динамическое программирование - это метод, позволяющий разбивать задачи на более мелкие подзадачи.

Это полезный навык для решения задач min change, max path sum и других вопросов на собеседовании по кодированию.

В этом курсе вы изучите методы динамического программирования на языке Java.

📌Курс

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Дайджест полезных материалов из мира Java за неделю

Почитать:
В Java 21 собираются реализовать сопоставление с образцом – так, глядишь, я снова на этот язык перейду
Добавление отзывов с фотографиями в S3 с помощью AWS SDK Java
Microsoft предлагает БЕСПЛАТНЫЕ онлайн курсы с сертификацией
Сделали по красоте: победители «Конкурса красоты кода»
OOM: direct memory при работе с сетью TCP/IP через NIO в Java
Построение гибкой и распределенной архитектуры с использованием Kafka и Kafka Connect: Часть 2 — Получатель и Helm Chart
Решаем задачу о секретном рукопожатии на Java
Продвинутый телеграмм бот на Java (Spring, postgres и free deploy)
Принцип Универсалий: или локальный подход к Dependency Injection
Вышла Java 21
Hello World in Java
Cracking the Code: Leet Code 1048 - Longest String Chain (Medium) - NileshDev
Cracking the LeetCode:392 Is Subsequence?
Semaphores, is that so easy!! The Clothing Store Analogy as a Guide for Beginners
Scanner em Java
#11 Example of Views & View Groups in android | Android Studio Tutorial | SoftwareTechIT
The Big Debate: Should We Explain Code or Not?
Using JLink to create smaller Docker images for your Spring Boot Java application
Salesforce Integration Services
How to prevent NullPointerExceptions in Java

Посмотреть:
🌐 Java21 Brings Full Pattern Matching #RoadTo21 ( 23:28)
🌐 Java 21 in Two Minutes... more or less ( 02:50)
🌐 How can you model a concurrent task in Java? - Cracking the Java Coding Interview ( 00:53)
🌐 Comparing Doubles with a comparator of Numbers? - Cracking the Java Coding Interview ( 00:56)
🌐 JDK 21 Release Notes - Inside Java Newscast #55 ( 34:18)
🌐 All About Java 21 - Launch Event ( 08:01:35)
🌐 Как становились программистами 20 лет назад и что изменилось сейчас — Леша Корепанов ( 01:02:28)

Хорошего дня!

@javatg
🖥 Microservices Project using Spring Boot

Подробный гайд по созданию микросервисов с использованием Spring Boot.

В этом учебном пособии показано -как создавать микросервис с использованием Spring Boot 3, Spring Cloud и базы данных PostgreSQL.

В этом микросервисном проекте вы изучите такие важные понятия, как API Gateway, Config Server, Discovery Server, и практически реализуете два реальных микросервиса - Student и School.

📌 Статья

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Java 21: новый подход к созданию строк

Оператор +
Известно, что использование оператора + считается плохой практикой. Дело в том, что строки неизменяемы, и в соответствии с внутренним механизмом новая строка создается для каждой объединяемой части. Однако “meten is weten”, что в переводе с голландского означает “хочешь знать — измерь”. Посмотрим, что на самом деле происходит внутри:
// Пример #1:
String example1 = "some String " + 42;

// Пример #2:
int someInt = 42;
String example2 = "some String " + someInt + " other String " + someInt;

// Пример #3:
String example3 = "";
for (int i = 0; i < 10; i++) {
example3 += someInt;
}


В байт-коде примера #1 осуществляется одно выделение строки. Компилятор Java понимает, что магическое число является константой, поэтому оно загружается как часть строки String в стек операндов:

0: ldc #7 // Строка some String42

Но мы не намерены применять магические значения, поэтому посмотрим, что происходит с переменными.

В примере #2 при использовании переменной компилятор Java не может выполнить такую же оптимизацию, но зато совершает какую-то сложную операцию с помощью invokedynamic:

0: bipush 42
2: istore_1
3: iload_1
4: iload_1
5: invokedynamic #7, 0 // InvokeDynamic #0:makeConcatWithConstants:
(II)Ljava/lang/String;

...

BootstrapMethods:
0: #22 REF_invokeStatic
java/lang/invoke/StringConcatFactory.makeConcatWithConstants:
(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke
/MethodType;Ljava/lang/String;
[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
Method arguments:
#23 одна String \u0001 другая String \u0001

Эта инструкция позволяет во время выполнения вызвать метод bootstrap для конкатенации. Мы даем ему “рецепт”: some String \u0001 other String \u0001, который в данном случае содержит 2 плейсхолдера. При конкатенации большего числа переменных увеличивается и число плейсхолдеров, но это все равно одна строка String в пуле констант.

Фишка подхода invokedynamic состоит в том, что при появлении обновленных версий JDK с техниками конкатенации JDK, байт-код может оставаться прежним, тогда как действия метода bootstrap усложняются (чуть позже о деталях текущей реализации).

В примере #3 в цикле выполняется следующая инструкция:

16: invokedynamic #9, 0 // InvokeDynamic #0:makeConcatWithConstants:
(Ljava/lang/String;I)Ljava/lang/String;


Она приводит к выделению ненужного количества экземпляров String.

String::format
На мой взгляд, String::format  — более эффективная альтернатива оператору +. Данный метод предлагает действительно улучшенную читаемость в ряде случаев и поддерживает локализацию. Основные тесты показывают, что его производительность немного превосходит конкатенацию. Однако реализация метода format создает новую строку String для каждого параметра.

Проведем небольшой эксперимент:

📌 Читать дальше

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Простым способом мэпинга SQL Native Query с объектом является проекция интерфейса. Вы определяете интерфейс и методы get() с именами, соответствующими возвращаемым столбцам. ИМХО, это более рациональный подход по сравнению с неизменяемыми сущностями.

#tips #java

@javatg
🔥 Дайджест полезных материалов из мира Java за неделю

Почитать:
Подтверждение электронной почты с помощью Spring Boot & Angular
jenv — удобный инструмент для управления версиями Java
15 лучших бесплатных курсов по Linux
Spring Cloud Config и Git. Хранение и распространение конфигураций приложений
Аннотации и рефлексия в Java
Объектно-ориентированный подход к созданию REST-клиентов, или возможна ли жизнь без Open API
Как я делал солнечную зарядку для своего моноколеса и вот что получилось
Обыкновенное чудо: итоги сезона Java
Кэширование контекста Spring между запусками тестов: как ускорить процесс локального тестирования
100 days of Code
Encapsulamento: O básico que todo jr. precisa saber
What is Low code app development?
Seeking Guidance on Gaining Real-Time Java Experience as a Beginner
Video896. Monotonic Array - Python, JavaScript, Java and C++
How to Create Time Picker Dialogue Android Tutorial | Best Android Developer Series #softwaretechit
10 Tips to Optimize Memory Usage and Avoid Common Exceptions in Java
SOLID! Um post "aprofundado"
JSON Schema applied to InterSystems IRIS
Turning an array clockwise or counterclockwise

Посмотреть:
🌐 Java Basics – Crash Course ( 3:36)
🌐 What is an annotation? - Cracking the Java Coding Interview ( 00:59)
🌐 When should you use ? extends T? - Cracking the Java Coding Interview ( 00:59)
🌐 JFR View Command ( 01:26)

Хорошего дня!

@javatg
🖥 BinDiff - это инструмент, написанный на Java для сравнения бинарных файлов с открытым исходным кодом, позволяющий быстро находить различия и сходства в дизассемблированном коде.

BinDiff содержит следующие компоненты:

cmake - файлы сборки CMake с объявлением внешних зависимостей
fixtures - Коллекция тестовых файлов для проверки работы ядра BinDiff
ida - Интеграция с дизассемблером IDA Pro
java - Исходный код Java. Он содержит пользовательский интерфейс визуального диффа BinDiff и соответствующую библиотеку утилит.
match - Алгоритмы сопоставления для ядра BinDiff
packaging - Исходники инсталляционных пакетов
tools - Исполняемые файлы-помощники, поставляемые вместе с продуктом

Github
Docs

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥Тестирование Java при помощи JUnit: примеры и советы по тестированию

JUnit — это открытый фреймворк для написания и запуска тестов на языке программирования Java. Он разработан с целью поддержки автоматизированных тестов, особенно модульных тестов (unit tests), и обеспечивает удобные аннотации, утверждения и утилиты, которые позволяют легко писать и запускать тесты для Java-кода.

Настройка тестовой среды JUnit
Для начала вам необходимо установить JUnit в ваш проект. Если вы используете Maven или Gradle, добавьте зависимость JUnit в ваш файл настроек. В изображениипример для Maven.


Основы и примеры написания тестов с JUnit
Структура теста
Тестовый класс создается отдельно от основного кода. Он содержит один или несколько тестовых методов, каждый из которых проверяет отдельный аспект работы кода. Тестовые методы помечаются аннотацией @Test.

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class CalculatorTest {

@Test
public void testAddition() {
Calculator calculator = new Calculator();
int result = calculator.add(2, 3);
assertEquals(5, result, "2 + 3 should equal 5");
}
}

Использование утверждений

📌 Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Может ли Java быть быстрой? Сравнение производительности Helidon Níma и Spring

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

Java долгое время была и остается фаворитом в enterprise решениях, но все чаще в высоконагруженных проектах предпочтение отдается более "производительным" языкам, таким как Go, а порой даже C++. Но вдруг Java тоже может быть быстрой?

📌 Читать дальше

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Документация Spring Boot 3 REST API с использованием SpringDoc OpenAPI

В этом руководстве подробно объясняется, как генерировать документацию REST API с помощью библиотеки SpringDoc OpenAPI в приложениях Spring Boot 3.

📌 Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
2024/10/02 16:24:24
Back to Top
HTML Embed Code: