Часто про блок
Пример из разряда «классика жанра»
Да, при делении на ноль выпадет исключение, но перед завершением работы всё, что внутри
Но есть ситуации, когда
Вызов
Теперь к более интересному
Представим, что у нас есть цепочка методов, где в конце мы хотим сделать какие-то действия в любом случае — например, зафиксировать результат в логах или отправить уведомление
Пусть методы вызывают друг друга вот так:
Пример
В этой схеме исключение может вылететь и в
Нам всё равно, где именно упало — код внутри
Это удобно, когда логика сложная и методы вызывают друг друга
👉 Java Portal
finally
пишут, что он всегда выполнится, даже если в коде случилась ошибка Пример из разряда «классика жанра»
public class FinallyExample {
public static void main(String[] args) {
try {
System.out.println("Старт");
int result = 10 / 0; // тут бахнет деление на ноль
} catch (ArithmeticException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
System.out.println("Этот блок всё равно выполнится");
}
}
}
Да, при делении на ноль выпадет исключение, но перед завершением работы всё, что внутри
finally
, всё равно выполнитсяНо есть ситуации, когда
finally
не доживёт до выполнения. Напримерpublic class FinallyExample {
public static void main(String[] args) {
try {
System.out.println("Старт");
System.exit(0); // мгновенный выход из программы
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
System.out.println("Этот блок уже не увидим");
}
}
}
Вызов
System.exit()
или убийство процесса извне (например, kill PID
) не даст finally
сработатьТеперь к более интересному
Представим, что у нас есть цепочка методов, где в конце мы хотим сделать какие-то действия в любом случае — например, зафиксировать результат в логах или отправить уведомление
Пусть методы вызывают друг друга вот так:
main
→ firstLogic
→ secondLogic
→ thirdLogic
→ fourthLogic
Пример
public static void main(String[] args) {
try {
firstLogic();
} finally {
System.out.println("FINALLY MAIN"); // логируем результат
}
}
public static void firstLogic() {
secondLogic();
}
public static void secondLogic() {
try {
thirdLogic();
} finally {
System.out.println("FINALLY SECOND"); // отправляем уведомление
}
}
public static void thirdLogic() {
fourthLogic();
}
public static void fourthLogic() {
System.out.println("D");
throw new RuntimeException();
}
В этой схеме исключение может вылететь и в
thirdLogic
, и в fourthLogic
Нам всё равно, где именно упало — код внутри
finally
, в main
и secondLogic
всё равно выполнитсяЭто удобно, когда логика сложная и методы вызывают друг друга
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Паттерн проектирования Memento
🔸 Сценарий: создание текстового редактора
Вы пишете текстовый редактор и вам нужна функциональность undo/redo.
Пользователь вводит, удаляет, форматирует текст и ожидает возможность откатить изменения к предыдущему состоянию.
Без Memento пришлось бы вручную отслеживать каждое изменение и разрабатывать логику обратного отката для каждого действия.
🔸 Проблемы без Memento
- Доступ к внутренним полям - нужно лезть в приватные данные объекта для сохранения/восстановления состояния
- Сложная логика отката - откат каждого типа операций приходится писать вручную
- Сильная связка - логика undo перемешана с бизнес-логикой
- Прожорливость памяти - хранение целых объектов вместо снапшотов
🔸 Как помогает Memento
Паттерн Memento говорит
Flow
1. Создать снимок состояния
2. Сохранить в Caretaker
3. Продолжить работу
4. Запросить откат
5. Восстановить состояние
🔸 Три ключевых компонента
- Originator - объект, чьё состояние нужно сохранить (например, документ)
- Memento - снимок состояния в определённый момент времени
- Caretaker - управляет снапшотами, но не может их изменять
🔸 Когда использовать Memento
- Undo/Redo в редакторах, играх, формах
- Транзакционный откат в базах данных или операциях
- Чекпоинты в долгих процессах
- История состояния для отладки или аудита
🔸 Преимущества
- Сохранение инкапсуляции - внутреннее состояние остаётся приватным
- Чистое разделение - логика отката отделена от бизнес-логики
- Гибкие снапшоты - сохраняется только то, что нужно
- Простота внедрения - стандартный и понятный паттерн
🔸 Примеры
- Текстовые редакторы - Ctrl+Z с сохранением состояния документа
- Фоторедакторы - панель истории шагов редактирования
- Игры - сохранения и чекпоинты
- Транзакции в БД - откат при сбое
🔸 Недостатки
- Память - хранение множества снапшотов
- Производительность - создание снапшотов требует времени
- Сложность для больших объектов - глубокое копирование может быть дорогим
👉 Java Portal
Вы пишете текстовый редактор и вам нужна функциональность undo/redo.
Пользователь вводит, удаляет, форматирует текст и ожидает возможность откатить изменения к предыдущему состоянию.
// Пользователь ввёл: "Hello"
// Пользователь ввёл: " World"
// Пользователь удалил: "World"
// Пользователь хочет откатить → восстановить "World"
// Пользователь хочет откатить снова → восстановить "Hello"
Без Memento пришлось бы вручную отслеживать каждое изменение и разрабатывать логику обратного отката для каждого действия.
- Доступ к внутренним полям - нужно лезть в приватные данные объекта для сохранения/восстановления состояния
- Сложная логика отката - откат каждого типа операций приходится писать вручную
- Сильная связка - логика undo перемешана с бизнес-логикой
- Прожорливость памяти - хранение целых объектов вместо снапшотов
Паттерн Memento говорит
> «Позволь объектам сохранять и восстанавливать своё состояние через снапшоты, не раскрывая внутренние детали».
Flow
1. Создать снимок состояния
2. Сохранить в Caretaker
3. Продолжить работу
4. Запросить откат
5. Восстановить состояние
- Originator - объект, чьё состояние нужно сохранить (например, документ)
- Memento - снимок состояния в определённый момент времени
- Caretaker - управляет снапшотами, но не может их изменять
- Undo/Redo в редакторах, играх, формах
- Транзакционный откат в базах данных или операциях
- Чекпоинты в долгих процессах
- История состояния для отладки или аудита
- Сохранение инкапсуляции - внутреннее состояние остаётся приватным
- Чистое разделение - логика отката отделена от бизнес-логики
- Гибкие снапшоты - сохраняется только то, что нужно
- Простота внедрения - стандартный и понятный паттерн
- Текстовые редакторы - Ctrl+Z с сохранением состояния документа
- Фоторедакторы - панель истории шагов редактирования
- Игры - сохранения и чекпоинты
- Транзакции в БД - откат при сбое
- Память - хранение множества снапшотов
- Производительность - создание снапшотов требует времени
- Сложность для больших объектов - глубокое копирование может быть дорогим
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤6👍2
Бесплатный API для получения полной информации об IP-адресе.
Без регистрации и каких-либо ограничений.
Работает с Python, JavaScript, Java, PHP, Go и другими языками.
Пример использования: http://api.ipquery.io/1.1.1.1
👉 Java Portal
Без регистрации и каких-либо ограничений.
Работает с Python, JavaScript, Java, PHP, Go и другими языками.
Пример использования: http://api.ipquery.io/1.1.1.1
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🌚3🤔2
Держи сотни гигабайт свежих уроков, и каждую неделю мы подкидываем ещё!
1402 ГБ — Python
1815 ГБ — Frontend
1515 ГБ — Backend
1300 ГБ — C / C++
694 ГБ — Java
546 ГБ — SQL & БД
411 ГБ — DevOps
898 ГБ — ИБ & Хакинг
212 ГБ — JavaScript
996 ГБ — Kotlin / Swift
173 ГБ — PHP
215 ГБ — GoLang
185 ГБ — Rust
517 ГБ — Linux
115 ГБ — QA / Тестирование
419 ГБ — GameDev
319 ГБ — 1C + Лицензии
617 ГБ — Машинное обучение
687 ГБ — Аналитика Данных
998 ГБ — Дизайн
Подписывайся и не плати за то, что можно получить бесплатно
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🌚1
Проект многопоточный загрузчик файлов на Java отлично подходит для изучения
Учит разбираться в многопоточности и конкурентности
Прокачивает навыки в:
> работе с данными
> файловом вводе-выводе
> многопоточности
> конкурентности
> работе с диапазонами Content-Length в HTTP-запросах
и не только💪
Вот один из проектов к примеру: https://github.com/winnerx0/java-project-box
👉 Java Portal
Учит разбираться в многопоточности и конкурентности
Прокачивает навыки в:
> работе с данными
> файловом вводе-выводе
> многопоточности
> конкурентности
> работе с диапазонами Content-Length в HTTP-запросах
и не только
Вот один из проектов к примеру: https://github.com/winnerx0/java-project-box
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3🔥1
Media is too big
VIEW IN TELEGRAM
Научись создавать проекты с нуля на любом языке программирования
Репо: https://github.com/practical-tutorials/project-based-learning
👉 Java Portal
Репо: https://github.com/practical-tutorials/project-based-learning
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4