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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
OCI-спецификации: образы, манифесты и слои

Open Container Initiative (OCI) — это стандарт, который определяет, как должны выглядеть контейнерные образы и runtime (среда выполнения). Docker следует этим спецификациям, чтобы образы были совместимы с другими инструментами, вроде Podman или containerd.

Образ — это шаблон для контейнера, как архив с файлами, конфигурацией и инструкциями. Он состоит из слоев (layers) — последовательных изменений файловой системы. Каждый слой — это blob (бинарный объект), хранящий дельту (изменения) от предыдущего.

Манифест — это JSON-файл, описывающий образ: платформу (архитектуру процессора), слои, конфигурацию (команда запуска, порты). Для multi-platform образов (для разных CPU, как AMD64 и ARM) есть index-манифест, указывающий на подманифесты.

Content-addressable storage
— хранение по хэшу содержимого. Каждый слой имеет уникальный хэш (SHA256), так что если слой не изменился, он не перезагружается. Это влияет на кэш: при сборке Docker проверяет хэш и использует кэш, если ничего не поменялось. "Тонкие" образы (thin images) — это когда слои минимальны, без лишних файлов, что экономит место в памяти и на диске. В памяти при запуске слои монтируются как union-файловая система (overlayfs): верхние слои перекрывают нижние, но в RAM загружается только то, что нужно.


Это позволяет эффективно хранить образы: общие слои (например, базовый Ubuntu) делятся между образами, снижая использование диска.


Регистры образов: Docker Hub, теги и управление

Регистр — это хранилище для образов, как репозиторий для кода. Docker Hub — публичный регистр, где хранятся официальные образы (например, openjdk). Можно использовать частные, вроде в AWS ECR или self-hosted.

Теги — это метки для версий образа, как "latest" или "21-jre". Образы иммутабельны (неизменяемы): после загрузки в регистр их нельзя изменить, только перезаписать тег. Это обеспечивает воспроизводимость: тег "1.0" всегда тот же.

Удаление и сборка мусора (GC): Когда вы удаляете тег, слой не удаляется сразу, если он используется другими тегами. GC (garbage collection) — процесс, который чистит неиспользуемые слои. В Docker Hub это автоматически, но в частных регистрах нужно настраивать. Нюанс: dangling images (висячие, без тегов) накапливаются и жрут место; используйте "docker image prune" для очистки.

Для Java полезно: официальные образы вроде eclipse-temurin:21-jre хранятся в Docker Hub, и теги помогают управлять версиями JVM.


Dockerfile: декларативный подход и подводные камни

Dockerfile — это текстовый файл с инструкциями для сборки образа. Он декларативный: вы описываете, что нужно, а Docker строит слои последовательно.

Ключевые инструкции:
FROM: базовый образ, например, FROM eclipse-temurin:21-jre.
RUN: выполняет команду, создает слой (например, RUN apt-get install ...).
COPY/ADD: копирует файлы в образ.
CMD/ENTRYPOINT: команда запуска.


Подводные камни:
Порядок инструкций: Docker кэширует слои по порядку. Если часто меняющийся RUN в начале, весь кэш сломается. Ставьте стабильные инструкции первыми.
Кэш: Каждый слой кэшируется по хэшу. Если файл в COPY изменился, слои ниже инвалидируются.
Слои: Много RUN создают много слоев — объединяйте в один RUN с && для минимизации. В памяти это значит меньше overhead при монтировании.


Для Java: избегайте установки лишнего в RUN, чтобы образ был маленьким.



#Java #middle #Docker #DockerFile #Docker_compose #Buildx
👍6
Современная сборка образов: BuildKit и Buildx как стандарт

BuildKit — это новый движок сборки, который с 2023 года используется по умолчанию в Docker. В отличие от старого билдера, который обрабатывал инструкции последовательно, BuildKit анализирует весь Dockerfile как граф зависимостей. Это значит, что он может выполнять независимые инструкции параллельно. Например, если у вас несколько RUN, которые не зависят друг от друга, BuildKit запустит их одновременно на разных ядрах процессора. На уровне системы это снижает время сборки: вместо линейного ожидания, вы получаете параллельное использование ресурсов, что в памяти хоста проявляется как более эффективное распределение CPU и RAM во время билда.

Одна из ключевых фишек BuildKit — улучшенный кэш. В классическом подходе кэш хранится локально и может сломаться при изменении инструкций. BuildKit вводит inline-кэш: вы можете экспортировать кэш прямо в образ или в регистр. При следующей сборке Docker pulls (загружает) этот кэш, что ускоряет процесс в CI/CD-пайплайнах (системах непрерывной интеграции и доставки). Например, если вы собираете образ в GitHub Actions, inline-кэш позволяет избежать полной перестройки каждый раз.

Еще нюанс — обработка секретов. В старом билдере пароли или API-ключи могли попасть в слои образа, что небезопасно. BuildKit позволяет передавать секреты через --secret флаг: они монтируются временно в память во время RUN, но не сохраняются в финальном образе. В памяти это работает как tmpfs (временная файловая система в RAM), так что секреты не пишутся на диск и не остаются в истории.

Buildx — это расширение BuildKit для сборки мультиплатформенных образов. Оно позволяет создавать один образ, который работает на разных архитектурах процессоров, таких как x86 (AMD64) и ARM (для Raspberry Pi или облачных инстансов). Под капотом Buildx использует эмуляцию через QEMU: для каждой платформы он запускает виртуальный билдер, собирает слой, и объединяет в манифест. Это влияет на память: эмуляция может потреблять больше RAM, но результат — универсальный образ, который Docker сам выбирает под хост.


Для Java это критично: JVM (виртуальная машина Java) имеет версии для разных платформ, и Buildx обеспечивает, что ваш образ с Java 21 будет работать везде без перестройки. Подводный камень: эмуляция медленнее нативной сборки, так что для больших проектов используйте удаленные билдеры в облаке.


Docker Compose версии 2: оркестрация для локальной разработки и CI

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

Compose работает как надстройка над Docker: он парсит файл docker-compose.yml и вызывает docker run для каждого сервиса. В памяти хоста это значит создание сети по умолчанию (bridge), где контейнеры общаются по именам, и volumes, которые монтируются как bind-mounts (привязки к хост-файлам) или named volumes (управляемые Docker).
Для локальной разработки Compose идеален: команда docker compose up запускает все сервисы, и вы можете отлаживать Java-приложение с базой данных, например, PostgreSQL. В CI, таком как Jenkins или GitLab CI, Compose используется для тестов: он поднимает окружение, запускает тесты и сносит все после.


Нюансы: Compose v2 быстрее v1 благодаря Go-реализации (вместо Python), и лучше интегрируется с Docker Desktop. Подводный камень — зависимости: если сервис A зависит от B, укажите depends_on, но это не гарантирует готовность (например, база данных может стартовать медленно). Для Java используйте healthchecks: в compose-файле добавьте проверку, чтобы приложение ждало базу.
Еще фишка — профили: вы можете группировать сервисы для разных сред (dev, test), чтобы не запускать все сразу.



#Java #middle #Docker #DockerFile #Docker_compose #Buildx
👍5
Примеры кода

Минимальный Dockerfile для Java 21 с использованием BuildKit

text# syntax=docker/dockerfile:1  # Включает расширения BuildKit
FROM eclipse-temurin:21-jre
WORKDIR /app # Рабочая директория внутри контейнера
COPY target/myapp.jar /app/myapp.jar # Копируем скомпилированный JAR
ENTRYPOINT ["java", "-jar", "/app/myapp.jar"] # Команда запуска


Чтобы собрать с BuildKit-фичами:
docker buildx build -t myapp:latest --cache-to=type=inline . 


Inline-кэш сохранит промежуточные результаты в образе.

Если добавить
--secret id=mysecret,source=/path/to/secret

то в RUN можно использовать $mysecret без записи в слой.



Мультиархитектурная сборка с Buildx

Buildx — стандарт для создания образов под несколько платформ.

Сначала создайте билдер:
docker buildx create --name mybuilder --use. 


Затем соберите:
docker buildx build --platform linux/amd64,linux/arm64 -t repo/myapp:latest --push .


Это создаст манифест, где Docker выберет нужный вариант. В памяти во время сборки эмуляция ARM на x86 может занять до 2x больше RAM, но результат — универсальность.


#Java #middle #Docker #DockerFile #Docker_compose #Buildx
👍3
Что выведет код?

public class Task260825 {
public static void main(String[] args) {
int a = 5;
double b = 2;
float c = 3.0f;

double result = a / b + c;
System.out.println(result);
}
}


#Tasks
👍2
Варианты ответа:
Anonymous Quiz
0%
5.8
4%
5.3
43%
5.5
54%
5.0
👍3
Что такое metaspace в JVM? 🤓

Ответ:

Metaspace
— это область памяти в JVM (с Java 8), заменяющая PermGen, для хранения метаданных классов, таких как описания классов и методы. В отличие от PermGen, metaspace динамически расширяется и не имеет фиксированного размера, что снижает риск OutOfMemoryError: PermGen.

Управляется параметрами JVM, такими как -XX:MaxMetaspaceSize.
Полезно понимать для оптимизации памяти в больших приложениях.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🗓 История IT-технологий сегодня — 27 августа


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

Лев Серге́евич Терме́н (фр. Léon Theremin; 16 [28] августа или 15 [27] августа 1896, Санкт-Петербург, Российская империя — 3 ноября 1993, Москва, Россия) — советский изобретатель, создатель терменвокса — первого электромузыкального инструмента.

Кри́стен Ню́гор (норв. Kristen Nygaard; 27 августа 1926, Осло — 10 августа 2002, там же) — норвежский учёный в области теории вычислительных систем, лауреат премии Тьюринга. Вместе с Оле-Йоханом Далем является одним из разработчиков основ объектно-ориентированного программирования, а также первого объектно-ориентированного языка программирования Симула.

Да́фна Коллер (англ. Daphne Koller, род. 27 августа 1968) — израильско-американский профессор факультета информатики Стэнфордского университета, стипендиат фонда Мак-Артура, сооснователь образовательной площадки Coursera. Основной областью исследований Коллер является искусственный интеллект и его приложения в биомедицине.


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

1962 — космическая миссия Mariner 2 отправилась на исследование Венеры.

1976 — Первое межсетевое TCP/IP-соединение: Дон Коун (SRI) запускает беспроводную связь между локальной сетью и ARPANET с помощью «Packet Radio Van» (порт в «интернет»).

1993 — Compaq Presario официально представлен на рынок. Один из первых массовых домашних ПК под брендом Compaq.

2003 — Включена самая большая в мире батарея (Fairbanks, Аляска) площадью около 2 000 м², весом ~1 300 т, обеспечивавшая аварийное электроснабжение. Выдающееся событие в области хранения энергии.


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

Глава 3. Наследование

Расширение классов с extends

Наследование — это механизм ООП, который позволяет создавать новый класс (подкласс или дочерний класс) на основе существующего (суперкласс или родительский класс). Подкласс "наследует" поля, методы и поведение суперкласса, добавляя или расширяя их. Это воплощает принцип "is-a" (является): например, "Собака является Животным".

Преимущества наследования:
Переиспользование кода: Не нужно дублировать общий код — подклассы используют то, что уже есть в суперклассе.
Иерархия: Позволяет строить иерархии классов, моделируя реальный мир (например, Животное → Млекопитающее → Собака).
Расширяемость: Подкласс может добавлять новые поля/методы или изменять поведение, не трогая суперкласс.
Полиморфизм: Наследование закладывает основу для полиморфизма (об этом в следующей главе).


В Java наследование реализуется с помощью ключевого слова extends. Java поддерживает только одиночное наследование (один суперкласс), но множественное — через интерфейсы.


Расширение классов с extends: Основы


Чтобы создать подкласс, используйте extends после имени класса, указав суперкласс.

Синтаксис:

public class Подкласс extends Суперкласс {
// Дополнительные поля и методы
}


Подкласс автоматически наследует все non-private поля и методы суперкласса.
Конструкторы не наследуются — их нужно определять заново, но можно вызывать конструктор суперкласса с super().


Пример базового суперкласса Animal:

public class Animal {
protected String name; // Protected: доступно в подклассах
private int age; // Private: не видно в подклассах напрямую

public Animal(String name, int age) {
this.name = name;
this.age = age;
}

public void eat() {
System.out.println(name + " ест.");
}

// Геттер для age (чтобы подклассы могли читать)
public int getAge() {
return age;
}
}


Теперь подкласс Dog, расширяющий Animal:
public class Dog extends Animal {
private String breed; // Новое поле

// Конструктор: Вызывает суперкласс с super()
public Dog(String name, int age, String breed) {
super(name, age); // Вызов конструктора Animal
this.breed = breed;
}

// Новый метод
public void bark() {
System.out.println(name + " лает: Гав!");
}

// Наследованный метод eat() доступен автоматически
}


Dog наследует name, eat() и getAge() от Animal.
super(name, age): Обязательно вызывает конструктор суперкласса (если он не по умолчанию). Должен быть первой строкой в конструкторе подкласса.


Новый метод bark(): Расширение поведения.
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Шарик", 5, "Лабрадор");
dog.eat(); // Наследованный: Шарик ест.
dog.bark(); // Новый: Шарик лает: Гав!
System.out.println("Возраст: " + dog.getAge()); // Возраст: 5
}
}



#Java #для_новичков #beginner #extends
👍4
Все нюансы расширения классов

Модификаторы доступа и наследование:
public: Наследуется и доступно везде.
protected: Наследуется и доступно в подклассах (даже в других пакетах) и в пакете суперкласса.
default (без модификатора): Наследуется только в том же пакете.
private: Не наследуется напрямую — подкласс не видит private-поля/методы. Используйте геттеры/сеттеры для доступа.
В примере name protected, так что Dog может использовать
this.name.

Конструкторы в наследовании:
Конструкторы не наследуются.
Если суперкласс имеет конструктор с параметрами, подкласс должен вызвать его с super(параметры).
Если суперкласс имеет только дефолтный конструктор, super() вызывается автоматически.
Нюанс: Если подкласс не вызывает super(), Java вставит super() без параметров. Если такого нет — ошибка компиляции.
Перегрузка: Подкласс может иметь несколько конструкторов, каждый вызывающий super().


Иерархия и класс Object:

Все классы в Java implicitly наследуют от java.lang.Object (если не указано extends).
Методы Object, такие как toString(), equals(), hashCode(), наследуются всеми классами.
Нюанс: Если вы extends другой класс, он уже наследует Object косвенно.


Одиночное наследование:
Java не поддерживает множественное наследование классов (extends A, B — ошибка). Это избегает "проблемы ромба" (конфликты при наследовании от двух классов с общим предком).
Для множественности используйте интерфейсы (об этом в главе об абстракции).


Final классы и методы:

Если суперкласс помечен final (final class Super {}), его нельзя extends — ошибка. (Например, String final.)
Нюанс: Это для immutable или secure классов.


Пакеты и видимость:
Если суперкласс в другом пакете, подкласс должен импортировать его (import package.Super;) или использовать полное имя.
Protected члены видимы в подклассах, даже в разных пакетах.


Ошибки и исключения:
Если подкласс пытается extends несуществующий класс — ошибка компиляции.
Циклическое наследование (A extends B, B extends A) — запрещено.
Подкласс может быть abstract, даже если суперкласс не abstract.


Производительность и дизайн:
Наследование — мощный инструмент, но не злоупотребляйте: предпочитайте композицию (has-a) над наследованием (is-a), если возможно, чтобы избежать жесткой связи.
Нюанс: Глубокие иерархии (много уровней) могут усложнить код — старайтесь держать 2-3 уровня.



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


Создайте суперкласс:
New → Java Class → Animal.

Создайте подкласс:

New → Java Class → Dog.
IntelliJ предложит extends: В коде напишите extends Animal — IDE подскажет импорт.


Генерация конструктора:
В Dog: Generate → Constructor → Выберите поля, и укажите super.

Запустите: В Main создайте объект Dog и протестируйте.


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


Используйте protected: Для полей/методов, которые нужны подклассам, но не внешнему коду.
Вызывайте super() первым: Всегда в начале конструктора — иначе ошибка.
Тестируйте наследование: Создавайте объекты подкласса и вызывайте наследованные методы.
Избегайте глубоких иерархий: Лучше плоская структура для простоты.



#Java #для_новичков #beginner #extends
👍4
Что выведет код?

class A270825 {
String value = "A";

void print() {
System.out.println(value);
}
}

class B270825 extends A270825 {
String value = "B";
}

public class Task270825 {
public static void main(String[] args) {
A270825 obj = new B270825();
obj.print();
System.out.println(obj.value);
}
}


#Tasks
👍2
Варианты ответа:
Anonymous Quiz
22%
A и A
37%
B и B
33%
A и B
7%
B и A
👍2
Вопрос с собеседований

Что такое escape analysis в JVM? 🤓

Ответ:
Escape analysis
— оптимизация JIT-компилятора JVM, которая определяет, может ли объект "убежать" из метода (например, быть возвращенным или сохраненным в поле). Если объект не убегает, он может быть размещен на стеке вместо кучи, снижая нагрузку на GC. Пример: локальный объект в методе, не выходящий за его пределы.

Это улучшает производительность, но прозрачно для разработчика.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🗓 История IT-технологий сегодня — 28 августа


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

Джошуа Блох (англ. Joshua J. Bloch) (род. 28 августа 1961 г.) — архитектор Java-платформы (Collections, concurrency, API-дизайн), автор «Effective Java».

Ше́рил Ка́ра Сэ́ндберг (англ. Sheryl Kara Sandberg[2], род. 28 августа 1969, Вашингтон) — техно-топ-менеджер (Meta/Facebook), сыграла ключевую роль в масштабировании рекламной и бизнес-инфраструктуры.

Сатоси Тадзири (яп. 田尻智 Тадзири Сатоси, род. 28 августа 1965 года) — японский геймдизайнер, создатель серии игр, манги и сериала «Покемон». Он вошёл в список ста самых лучших геймдизайнеров по версии IGN.


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

2009 — прекращена служба AppleTalk — одно из первых сетевых решений Apple для локального обмена данными, признанное устаревшим.


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

Переопределение и ключевое слово super

Что такое переопределение методов в ООП?

Переопределение (method overriding) — это возможность подкласса предоставить свою реализацию метода, унаследованного от суперкласса. Это воплощает полиморфизм: объект подкласса может вести себя иначе, чем суперкласс, но сохранять ту же сигнатуру метода.

Когда использовать: Если поведение суперкласса не подходит для подкласса, но имя и параметры метода должны остаться теми же (например, все животные едят, но собака ест по-своему).

Правила переопределения:
Сигнатура метода (имя, параметры) должна быть идентичной суперклассу.
Тип возвращаемого значения может быть подтипом (covariant return type) в Java 5+.
Модификатор доступа не может быть строже (например, если в супер protected, в подклассе нельзя private, но можно public).
Метод в суперкласса не должен быть final или static (static не переопределяются, а скрываются).
Аннотация
@Override: Рекомендуется добавлять для проверки компилятором — если метод не переопределяет, ошибка.

Нюанс: Переопределение отличается от перегрузки (overloading) — перегрузка: разные сигнатуры в одном классе; переопределение: одинаковые сигнатуры в иерархии.


Ключевое слово super: Доступ к суперклассу

super — это ссылка на суперкласс, аналог this для родителя.


Оно используется для:
Вызова методов суперкласса (super.method()).
Доступа к полям суперкласса (super.field), если они скрыты.
Вызова конструктора суперкласса (super(params)).


super полезно, когда в подклассе переопределен метод, но нужно вызвать оригинальную версию из суперкласса.


Подробный пример

Возьмем класс: Animal (суперкласс) и Dog (подкласс).

Суперкласс Animal:
public class Animal {
protected String name;
private int age;

public Animal(String name, int age) {
this.name = name;
this.age = age;
}

public void eat() {
System.out.println(name + " ест пищу.");
}

public int getAge() {
return age;
}
}


Подкласс Dog с переопределением:

public class Dog extends Animal {
private String breed;

public Dog(String name, int age, String breed) {
super(name, age); // Вызов конструктора суперкласса
this.breed = breed;
}

// Переопределение метода eat()
@Override // Аннотация для проверки
public void eat() {
super.eat(); // Вызов версии из суперкласса
System.out.println("Но предпочитает кости!"); // Расширение поведения
}

public void bark() {
System.out.println(name + " лает: Гав!");
}
}

Аннотация @Override: Указывает, что метод переопределен. Если ошибка (например, сигнатура не совпадает) — компилятор предупредит.
super.eat(): Вызывает оригинальный eat() из Animal, затем добавляет свое.
Если убрать super.eat(), метод полностью заменит поведение суперкласса.


Нюанс: Если поле в подклассе скрывает поле суперкласса (field hiding, редко рекомендуется), super.field дает доступ к скрытому.


#Java #для_новичков #beginner #extends #super
👍3
Все нюансы переопределения и super

Сигнатура и совместимость:
Имя, количество/типы параметров должны совпадать точно.
Возврат: Может быть подтипом (например, супер возвращает Animal, под — Dog).
Исключения: Подкласс может бросать меньше или подтипы исключений, но не больше (checked exceptions).


Модификаторы:
Доступ: Может быть шире (protected → public), но не уже (public → protected — ошибка).
Final: Final-методы нельзя переопределять.
Static: Static-методы не переопределяются — это method hiding. Вызов зависит от типа ссылки, не объекта.
Private: Private-методы не видны, так что не переопределяются.


super в конструкторах:
Должен быть первой строкой.
Если не указан, Java вставит super() без параметров.
Нюанс: В цепочке иерархий (A extends B extends C) конструкторы вызываются сверху вниз: C() → super(B) → super(A).


super для методов и полей:

super.method(): Вызывает версию суперкласса, даже если переопределен.
Полезно для расширения, а не замены поведения.
Нюанс: super не работает для static — используйте SuperClass.method().
Field hiding: Если подкласс имеет поле с тем же именем, super.field дает доступ к суперклассу.


Ошибки компиляции и runtime:
Без @Override: Если сигнатура не совпадает, создастся новый метод (overloading вместо overriding) — неожиданное поведение.
Runtime: Если метод не переопределен правильно, вызовется версия суперкласса.
Abstract методы: Должны быть переопределены в non-abstract подклассах.


Полиморфизм и overriding:
Вызов метода зависит от типа объекта, не ссылки: Animal a = new Dog(); a.eat() — вызовет Dog.eat().
Нюанс: Для полей — наоборот, зависит от типа ссылки (field hiding, не overriding).


Дизайн и лучшие практики:
Переопределяйте только когда нужно изменить поведение.
Используйте super для композиции поведения.
Избегайте переопределения для радикальных изменений — лучше новый метод.
В больших иерархиях: Документируйте, что можно переопределять.



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

Переопределение метода:
В подклассе Dog: Ctrl+O (Override Methods) → Выберите eat() — IDE добавит @Override и скелет.

Добавьте super:
В сгенерированном методе вставьте super.eat().
Проверка: IDE подскажет ошибки в сигнатуре или доступе.


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

Всегда используйте @Override: Избегайте ошибок.
Тестируйте полиморфно: Создавайте ссылки суперкласса на объекты подкласса и проверяйте вызовы.
super в конструкторах: Не забывайте, если суперкласс требует параметров.
Избегайте field hiding: Лучше разные имена для полей.


#Java #для_новичков #beginner #extends #super
👍5
Какая зп в месяц для Вас была бы достаточной для жизни без излишеств (роскоши, ежемесячных поездок в тайланд и тд)?
Anonymous Poll
4%
30-50 тысяч
9%
50-80 тысяч
27%
80-120 тысяч
47%
120-300 тысяч
13%
Более 300 тысяч
👍4
Тестирование в Spring
4. Интеграционные тесты в Spring.
Тестирование БД (Zonky, Testcontainers, SQL-скрипты, Liquibase).

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

Что мы рассмотрели:
🔵Как в целом поднять интеграционные тесты с БД и зачем нам это вообще.
🔵Различные способы внедрения тестовых данных в тест и базу данных (Json, SQL, Faker, Instancio).
🔵Запуск тестовой БД PostgresQL в памяти JVM (Zonky) и контейнере Docker(Testcontainers).
🔵Как можно ошибиться и не найти ошибку)))

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

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

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

class A280525 {
String message = "A";

void print() {
System.out.println(message);
}
}

class B280525 extends A280525 {
String message = "B";

void print() {
super.print();
System.out.println(message);
}
}

class C280525 extends B280525 {
String message = "C";

void print() {
super.print();
System.out.println(message);
}
}

public class Task280825 {
public static void main(String[] args) {
A280525 obj = new C280525();
obj.print();
}
}


#Tasks
👍3🔥1