Java for Beginner
743 subscribers
709 photos
201 videos
12 files
1.15K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Тестирование в Spring
3. Модульные тесты через TDD в Spring. Тестирование Spring Security и Spring Cash.

Серия видео посвященная тестированию всего и вся в Spring.

Что мы рассмотрели:
🔵как написать тест контроллера через TDD
🔵как добавить в проект и протестить простую аутентификацию через Spring Security и использованием JWT.
🔵как протестить внешнее взаимодействие через FeignClient и WireMock
🔵как добавить в проект и протестить кэширование.

Ссылка на Youtube
Ссылка на Рутьюб

Ссылка на GitHub - жду ваших звезд ☺️

Смотрите, ставьте лайки, подписывайтесь на каналы!✌️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Что выведет код?

public class Task180825 {
static void method(Object x) {
System.out.println("Object");
}

static void method(String x) {
System.out.println("String");
}

static void method(Integer x) {
System.out.println("Integer");
}

public static void main(String[] args) {
method(null);
}
}


#Tasks
👍3
👍3
Карточка для запоминания while 😎

#memory_card
👍7
Что такое ConcurrentLinkedQueue? 🤓

Ответ:
ConcurrentLinkedQueue
— потокобезопасная очередь на основе связного списка, подходящая для многопоточных приложений.

Пример:
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
queue.offer("Task");
System.out.println(queue.poll()); // Task

Не блокирует потоки, в отличие от BlockingQueue.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🗓 История IT сегодня — 19 августа


ℹ️ Кто родился в этот день

Са́тья Нараяна Наде́лла (англ. Satya Narayana Nadella; телугу సత్యనారాయణ నాదెళ్ల; род. 19 августа 1967, Хайдарабад) — американский топ-менеджер индийского происхождения. Генеральный директор компании Microsoft. CEO Microsoft; развернул компанию на облака и ИИ, провёл сделки LinkedIn и GitHub.

Честер Гордон Белл (англ. Chester Gordon Bell; 19 августа 1934, Керксвилл, США — 17 мая 2024, Коронадо, США) — американский инженер-электрик, компьютерный инженер и менеджер. В 1960—1966 годах в Digital Equipment Corporation (DEC) разработал несколько мини-компьютеров PDP. В 1972—1983 годах был вице-президентом DEC, курируя разработку VAX. Дальнейшая карьера Гордона Белла — предприниматель, инвестор, вице-президент Национального научного фонда, а также почётный представитель Microsoft Research в 1995—2015 годах. В 1972 году сформулировал закон о классах компьютеров (англ. Bell's law of computer classes), в котором обосновал смену компьютерных систем.

Луис Фон Ан (исп. Luis von Ahn; род. 19 августа 1978, Гватемала, Гватемала) — создатель CAPTCHA/reCAPTCHA и со-основатель Duolingo; один из пионеров краудсорсинга.


🌐 Знаковые события

1960«Спутник-5» (Белка и Стрелка): запуск корабля с двумя собаками и бионабором; первый успешный полёт с возвращением живых существ с орбиты (посадка 20 августа).

1964Syncom 3: запуск первого геостационарного спутника связи; обеспечил прямые телетрансляции Олимпиады-1964 из Токио.

1976«Луна-24»: старт взлётной ступени с лунного грунта (≈170 г) к Земле; последний на сегодня успешный советский/российский образец возврата пробы с Луны.

2003Червь Sobig.F: один из самых быстрых почтовых червей; вспышка началась 19 августа и быстро перегрузила почтовые системы мира.

2004IPO Google: торги стартовали на NASDAQ по $85; день закрылся $100.34 (+18%). Формат — модифицированный «голландский аукцион».

2010 Intel покупает McAfee: объявлена сделка на $7.68 млрд (крупнейшая покупка Intel на тот момент) — ставка на интеграцию безопасности в «железо».


#Biography #Birth_Date #Events #19Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Основы ООП в Java

Глава 1. Классы и объекты


Конструкторы. Перегрузка. Ключевое слово this


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

Сигнатура конструктора:
Имя совпадает с именем класса.
Нет типа возвращаемого значения (даже void не пишется).
Может иметь параметры для передачи значений.


Если вы не определяете конструктор, Java создает пустой конструктор автоматически:
public Person() {
// Пусто, поля инициализируются значениями по умолчанию (null для объектов, 0 для чисел)
}


Пример простого конструктора:
public class Person {
private String name;
private int age;

// Конструктор с параметрами
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}

При создании объекта new Person("Алексей", 35) конструктор присваивает значения полям.



Ключевое слово this

this — это ссылка на текущий объект.


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


Пример использования this:
public class Person {
private String name;
private int age;

public Person(String name, int age) {
this.name = name; // this.name — поле класса, name — параметр
this.age = age;
}
}

Без this Java бы подумал, что name = name; — это присваивание параметра самому себе, что бесполезно.



Перегрузка конструкторов

Перегрузка — это создание нескольких методов с одним именем, но разными параметрами. Для конструкторов это позволяет создавать объекты разными способами.

Правила перегрузки:
Разные сигнатуры (количество, типы или порядок параметров).
Конструкторы могут вызывать друг друга с помощью this() для избежания дублирования кода.


Пример перегрузки:

public class Person {
private String name;
private int age;

// Конструктор по умолчанию (без параметров)
public Person() {
this.name = "Неизвестный";
this.age = 0;
}

// Конструктор с одним параметром
public Person(String name) {
this.name = name;
this.age = 0; // Возраст по умолчанию
}

// Конструктор с двумя параметрами
public Person(String name, int age) {
this.name = name;
this.age = age;
}

// Вызов другого конструктора с помощью this()
public Person(int age) {
this("Неизвестный", age); // Вызывает конструктор с двумя параметрами
}
}

Теперь объекты можно создавать по-разному:Person p1 = new Person(); // Неизвестный, 0
Person p2 = new Person("Алексей"); // Алексей, 0
Person p3 = new Person("Алексей", 35); // Алексей, 35
Person p4 = new Person(35); // Неизвестный, 35



Как создать это в IntelliJ IDEA

Добавьте конструкторы в класс:
Откройте класс Person.
Вставьте код с перегрузкой.
IntelliJ IDEA может генерировать конструкторы: Правой кнопкой → Generate → Constructor, выберите поля.



Тестируйте в Main:
Создайте класс Main и добавьте код для создания объектов.
Запустите: Правой кнопкой на
Main.java → Run.


Полезные советы для новичков

Избегайте дублирования:
Используйте this() для вызова одного конструктора из другого. Вызов должен быть первой строкой.
Параметры vs поля: Всегда используйте this при совпадении имен — это хорошая практика.
Конструктор без параметров: Полезен для создания объектов с значениями по умолчанию.
Ошибки: Если конструктор с параметрами есть, дефолтный не создается автоматически — добавьте его вручную, если нужен.
Практика: Перегружайте конструкторы, чтобы класс был гибким.



#Java #для_новичков #beginner #constructor
👍5🔥1
Что выведет код?

class A190825 {
static {
System.out.print("1");
}

{
System.out.print("2");
}

public A190825() {
System.out.print("3");
}
}

class B190825 extends A190825 {
static {
System.out.print("4");
}

{
System.out.print("5");
}

public B190825() {
System.out.print("6");
}
}

public class Task190825 {
public static void main(String[] args) {
new B190825();
System.out.print("7");
new B190825();
}
}


#Tasks
👍2
👍4
Что такое Files.walk() в Java? 🤓

Ответ:
Метод Files.walk()
(Java 8) рекурсивно обходит дерево файлов, возвращая поток Path.

Пример:
Files.walk(Paths.get("."))
.filter(p -> p.toString().endsWith(".java"))
.forEach(System.out::println);

Удобен для поиска файлов или обработки директорий.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🗓 История IT сегодня — 20 августа


ℹ️ Кто родился в этот день

Том Демарко (также ДеМарко, род. 20 августа 1940 года, Хейзлтон, штат Пенсильвания, США) — классик инженерии ПО; «Peopleware», структурный анализ, влияние на практику менеджмента проектов.

Мартин Догиамас (Martin Dougiamas 1969) — основатель Moodle, одной из самых распространённых LMS в мире.

Эрик Голес Чакк (Антофагаста, 21 августа 1951) — учёный в области дискретной математики и клеточных автоматов, лауреат премий за вклад в информатику Чили.


🌐 Знаковые события

1912Томас Эдисон патентует электробатарею.

1956Начала действовать ядерная электростанция «Колдер Холл», первая ядерная электростанция Британии.

1964Основан Интелсат — компания, владеющая группировкой телекоммуникационных спутников.

1975запуск американской межпланетной станции Viking 1 к Марсу.

2024прекращена работа мессенджера «Агент Mail.ru» (пользователям предложено перейти на VK).


#Biography #Birth_Date #Events #20Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Apache Kafka

Схемы, сериализация и эволюция контрактов

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


Форматы: Avro, Protobuf, JSON-Schema

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

- Avro: Бинарный формат от Apache, ориентированный на экосистему Hadoop. Схема описывается в формате, похожем на JSON, и определяет записи с полями (простые типы, сложные: массивы, карты, объединения). Avro поддерживает эволюцию: добавление необязательных полей с значениями по умолчанию, удаление с defaults. В памяти сериализатора схема разбирается в общую запись (GenericRecord) или конкретную (SpecificRecord с генерированным кодом), где данные хранятся как древовидная структура (например, карта строк на объекты). Сериализация — рекурсивный обход, кодирование в буфер байтов с переменной длиной для эффективности. Затраты: схема может не включаться полностью, в Kafka обычно используется идентификатор схемы вместо полной версии. Преимущества: быстро (быстрее JSON), компактно, встроенная поддержка эволюции.

- Protobuf (Protocol Buffers): Бинарный формат от Google, с файлами .proto (сообщения с полями: обязательными, необязательными, повторяющимися). Поддерживает эволюцию: добавление полей с новыми номерами тегов (совместимо назад), но удаление или изменение типов рискованно. В памяти: Protobuf использует сгенерированные классы (через компилятор protoc), где сообщение — неизменяемый объект с методами доступа; сериализация в поток с переменными числами и длинами. Нет встроенных значений по умолчанию для новых полей (неизвестные поля игнорируются). Затраты: очень компактно (компактнее Avro за счёт тегов), быстрое разбор. Нюанс: в Kafka требуется внешний реестр для версионности, поскольку формат передачи не включает схему.

- JSON-Schema: Стандарт для описания структур JSON (версия draft-07 и выше). Не бинарный, но подходит для JSON-данных. Схема — объект JSON с свойствами, обязательными полями и типами. Эволюция: добавление свойств (если не обязательные), но JSON раздувается. В памяти: десериализация в карту или объект через библиотеки (например, Jackson с JsonSchema). Затраты: slowest и largest payloads, но читаемо человеком. Используйте для прототипов; в производстве предпочитайте бинарные для высокой пропускной способности.

Компромиссы: Avro и Protobuf для реальных систем (компактные, быстрые), JSON-Schema для простоты. В памяти все форматы используют временные буферы (буферы байтов в Java) для кодирования и декодирования; нагрузка на сборку мусора выше для сложных схем (много объектов).


#Java #middle #Kafka #Kafka_serializers #Kafka_deserializers
👍3
Реестр схем: именование субъектов, версионность, режимы совместимости (назад, вперёд, полная), формат передачи: магический байт + идентификатор схемы

Реестр схем (Schema Registry от Confluent, с открытым кодом) — централизованный сервис для хранения и проверки схем, интегрированный с Kafka. Он обеспечивает контракт: отправители регистрируют схемы, получатели загружают по идентификатору.

- Именование субъектов: Субъект — ключ для схемы, обычно имя темы с суффиксом -value или -key (стратегия именования: по умолчанию, по теме, по имени записи). Например, "orders-value" для значения в теме orders. Версионность: каждая схема под субъектом имеет версии (1, 2, ...), автоматически увеличивающиеся при регистрации, если совместима.

- Режимы совместимости: Правила проверки новой схемы по отношению к существующим.
- Назад (BACKWARD): Новая схема может читать старые данные (добавление необязательных полей нормально, удаление — нет). Для развёртки сначала потребителей.
- Вперёд (FORWARD): Старые схемы могут читать новые данные (добавление обязательных — нет, удаление необязательных — нормально). Для развёртки сначала отправителей.
- Полная (FULL): И назад, и вперёд (транзитивно: проверка со всеми предыдущими).
Режим настраивается по субъекту (по умолчанию назад с транзитивностью). В реестре: при отправке на /subjects/{subject}/versions сервер разбирает схему и проверяет совместимость через библиотеки (для Avro — валидатор схем, для Protobuf — аналогично).


- Формат передачи: Сообщение = магический байт (0 для Confluent) + идентификатор схемы (4-байтовое целое) + полезная нагрузка. В памяти сериализатора: идентификатор загружается из реестра (кэшируется локально в клиенте реестра: карта субъектов на версии и схемы), затем кодируется нагрузка. Десериализатор: читает магический байт и идентификатор, загружает схему (из кэша), декодирует. Кэш снижает задержку (срок жизни настраивается), но устаревший кэш может вызвать ошибку несовместимой схемы.

В памяти реестра (REST-сервис на Java): схемы хранятся в бэкенде (тема Kafka _schemas или база данных), с кэшем в памяти для быстрого доступа. Нюанс: высокая доступность через несколько экземпляров с выбором лидера.


Сериализаторы в Java: Avro (от Confluent), сериализатор/десериализатор Protobuf

В клиентах Kafka сериализаторы — реализации интерфейсов для сериализации и десериализации.

- Avro (от Confluent): io.confluent.kafka.serializers.KafkaAvroSerializer. Интегрирован с реестром: в методе сериализации загружает или регистрирует схему, пишет магический байт, идентификатор и данные. Для общих данных — общая запись; для конкретных — классы с генерированным кодом через плагин avro-maven. Десериализатор: KafkaAvroDeserializer, с настройкой автоматической регистрации схем false для производства. В памяти: использует писатели и читатели данных, пул буферов байтов для повторного использования.

- Protobuf: io.confluent.kafka.serializers.protobuf.KafkaProtobufSerializer. Аналогично: сообщения Protobuf генерируются из .proto, сериализатор регистрирует схему (Protobuf преобразуется во внутреннюю JSON-схему). В памяти: динамическое сообщение Protobuf, но предпочтительны сгенерированные для безопасности типов. Десериализатор разбирает с загруженной схемой.

Нюанс: кастомные сериализаторы расширяют абстрактный класс; затраты — загрузка схемы при инициализации (блокирующая), потом асинхронная.


#Java #middle #Kafka #Kafka_serializers #Kafka_deserializers
👍3
Пример producer с Avro

Вот базовый пример отправителя с сериализацией Avro, интегрированным с реестром схем:
import org.apache.kafka.clients.producer.*;
import io.confluent.kafka.serializers.KafkaAvroSerializer;
import org.apache.avro.generic.GenericRecord;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import java.util.Properties;

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092"); // Адреса серверов Kafka
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); // Сериализатор для ключей
props.put("value.serializer", KafkaAvroSerializer.class.getName()); // Сериализатор для значений Avro
props.put("schema.registry.url", "http://schema-registry:8081"); // URL реестра схем

KafkaProducer<String, GenericRecord> producer = new KafkaProducer<>(props);

// Пример схемы и записи
String schemaStr = "{\"type\":\"record\",\"name\":\"Order\",\"fields\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"amount\",\"type\":\"double\"}]}";
Schema schema = new Schema.Parser().parse(schemaStr); // Разбор схемы
GenericRecord record = new GenericData.Record(schema); // Создание записи
record.put("id", 1); // Заполнение поля id
record.put("amount", 100.5); // Заполнение поля amount

ProducerRecord<String, GenericRecord> producerRecord = new ProducerRecord<>("orders", "key", record); // Создание записи для отправки
producer.send(producerRecord); // Отправка
producer.close(); // Закрытие отправителя


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


Нюансы

- Тестирование эволюции схем: Создайте интеграционные тесты с имитацией реестра (встроенный Kafka плюс mock-клиент реестра). Шаги: зарегистрируйте первую версию схемы, отправьте данные; эволюционируйте ко второй (добавьте поле), проверьте режим совместимости; получите данные с десериализатором первой версии на данных второй (совместимость вперёд) и наоборот (назад). Используйте инструменты: avro-tools для сравнения, или тесты JUnit с проверкой совместимости схем. Нюанс: тестируйте транзитивную совместимость (третья версия с первой); имитируйте сброс кэша. В непрерывной интеграции: автоматизируйте с плагинами Gradle или Maven для валидации схем.

- Управление схемами (процесс одобрения): В крупных организациях внедрите рабочий процесс: схемы в репозитории Git, запросы на слияние с проверками совместимости (через плагин schema-registry-maven). Одобрение: ревью коллег плюс автоматические тесты; развёртка только после слияния. Используйте политику совместимости реестра по субъекту; для строгого контроля — полная транзитивная. Нюанс: семантика версионности (семантическое версионирование: мажорная для breaking changes), журнал аудита в реестре. Интегрируйте с процессами непрерывной интеграции и доставки: блокируйте развёртку при несовместимости.

- Сложности миграции с одного формата на другой: Миграция (например, с JSON на Avro) требует фазы двойной записи и чтения: отправители пишут в новую тему с новым форматом, получатели мигрируют постепенно. Сложности: преобразование данных (кастомный трансформер в Streams), обеспечение согласованности (атомарный переключатель невозможен из-за смещений). Затраты: двойное хранение во время перехода; конфликты схем при смешанных данных. Нюанс: для миграции в реальном времени используйте MirrorMaker с кастомными сериализаторами; риски — ошибки десериализации при коллизиях идентификаторов. Тестируйте с канареечными развёртками; время миграции — недели или месяцы для больших наборов данных.


#Java #middle #Kafka #Kafka_serializers #Kafka_deserializers
👍3
Что выведет код?

import java.io.*;

class Data200825 implements Serializable {
private static final long serialVersionUID = 1L;
transient int x = 10;
int y = 20;
}

public class Task200825 {
public static void main(String[] args) throws Exception {
Data200825 original = new Data200825();

ByteArrayOutputStream baos = new ByteArrayOutputStream();
new ObjectOutputStream(baos).writeObject(original);

Data200825 restored = (Data200825) new ObjectInputStream(
new ByteArrayInputStream(baos.toByteArray())).readObject();

System.out.println(restored.x + " " + restored.y);
}
}


#Tasks
👍1
Варианты ответа:
Anonymous Quiz
0%
0 0
13%
10 0
40%
0 20
47%
10 20
👍1
Карточка для запоминания break 😎

#memory_card
👍5
Что такое MethodHandle в Java? 🤓

Ответ:
MethodHandle
(Java 7) — объект для динамического вызова методов, более гибкий, чем рефлексия.

Пример:
MethodHandle handle = MethodHandles.lookup()
.findVirtual(String.class, "toUpperCase", MethodType.methodType(String.class));
String result = (String) handle.invoke("test"); // TEST

Используется в высокопроизводительных библиотеках.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2