Java Learning
18.7K subscribers
1.62K photos
1 video
3 files
998 links
№ 5079899194

Обучающий канал по Java

Ссылка для друга - https://t.iss.one/+ZEYYht6-46w5MDM6

По всем вопросам @mascarov_valentin

Реклама на бирже - https://telega.in/c/Java_per_month
Download Telegram
Стек-трейс

Стек-трейс (stack trace) представляет собой список вызовов методов в обратном хронологическом порядке, начиная с метода, в котором произошло исключение. Стек-трейс позволяет отследить, какие методы были вызваны перед возникновением исключения, и предоставляет информацию о местоположении, где произошло исключение.

#для_продвинутых
👍14
Checked exceptions

Checked exceptions — это исключения, которые должны быть обработаны или объявлены в сигнатуре метода при помощи throws ключевого слова. Они обычно представляют собой ситуации, которые программист может предвидеть и обработать. Примеры таких исключений включают: IOException, SQLException, FileNotFoundException.

Если вы вызываете метод, который объявляет checked exception, вы должны либо обработать это исключение с помощью конструкции try-catch, либо продолжить передачу исключения вверх по стеку вызовов.

#для_начинающих
👍11
unchecked exception

unchecked exception (непроверяемое исключение) относится к исключениям, которые не требуется обязательно обрабатывать или объявлять в секции throws метода. Эти исключения наследуются от класса RuntimeException или его подклассов. Они обычно свидетельствуют о ситуациях, которые могут возникнуть в ходе выполнения программы, но которые, как правило, связаны с ошибками программирования или непредвиденными ситуациями.

#для_начинающих
👍131
High cohesion

High cohesion (высокая связанность) — это принцип проектирования программного обеспечения, который означает, что компонент или модуль программы должен иметь чёткую и ограниченную ответственность, а все его функции и элементы должны быть связаны логически и тесно между собой. Это позволяет создать более структурированный и легко поддерживаемый код.

В Java принцип высокой связанности можно применить, следуя ряду практик:

1. Разделение функциональности
2. Ограниченная ответственность
3. Минимизация зависимостей
4. Принцип единственной ответственности (Single Responsibility Principle)
5. Группировка по функциональности

#для_продвинутых
👍61
Метод clone()

Метод clone() предназначен для создания поверхностной копии (shallow copy) объекта. Это означает, что он создает новый объект, который является копией исходного объекта, но содержит ссылки на те же самые объекты внутри, что и исходный объект. Процесс клонирования выполняется с помощью реализации интерфейса Cloneable.

Однако следует помнить, что метод clone() выполняет поверхностное копирование только для примитивных типов данных и ссылок на объекты. Для глубокого клонирования, то есть создания копии объекта и всех его вложенных объектов, вам потребуется реализовать собственную логику клонирования, чтобы гарантировать, что все вложенные объекты также будут скопированы.

#для_начинающих
👍6
Прокси-объект

Прокси-объект (Proxy Object) — это объект, который действует как промежуточный слой между клиентским кодом и реальным объектом. Прокси-объект позволяет выполнять дополнительные действия перед или после вызовов методов реального объекта, а также контролировать доступ к этим методам.

Прокси-объекты в Java реализуются с помощью интерфейсов и динамического создания классов во время выполнения. Для создания прокси-объекта в Java существует два основных способа: с использованием JDK Proxy и с использованием библиотеки CGLIB.

#для_продвинутых
👍8
1
Каким будет вывод этого кода?
Anonymous Quiz
15%
true
74%
false
3%
0
1%
1
7%
Узнать ответ
👍202
Фундаментальное руководство по пакетам в Java

Java-пакеты реализуют так называемое пространство имен (namespace), позволяющее использовать в проекте файлы с одинаковыми именами.

Смотреть статью
👍63
Ковариантность типов

Ковариантность типов — это вариантность типов в системе типов языка программирования. Ковариантность означает, что типы могут быть связаны отношением «родитель-потомок» в иерархии классов или интерфейсов, и этот относительный порядок сохраняется при передаче аргументов методам или возвращении значений из методов. Другими словами, ковариантность позволяет использовать подтип (потомок) вместо его родителя без необходимости явного приведения типов.

#для_начинающих
👍151
Что такое «fail-fast поведение»?

Fail-fast поведение (fail-fast behavior) — это принцип в программировании, который подразумевает, что программа должна обнаруживать ошибки и некорректные условия как можно раньше и немедленно генерировать исключения или останавливать выполнение, чтобы предотвратить дальнейшие некорректные операции и минимизировать возможные повреждения данных или неправильное поведение программы.

В Java fail-fast поведение реализуется с использованием механизмов. Если в процессе выполнения программы обнаруживается какое-либо нарушение, например, попытка доступа за пределы массива или передача недопустимого аргумента в метод, генерируется исключение, и выполнение программы прерывается.

#для_продвинутых
👍8
Прямой обход дерева

Прямой обход дерева (pre-order traversal) — это один из способов обхода бинарного дерева. В этом способе сначала посещается корневой узел, затем левое поддерево и затем правое поддерево. Прямой обход широко используется для вывода структуры дерева и выполнения операций на каждом узле в нужном порядке.

#для_продвинутых
👍10
Мёртвая нить

Мёртвая нить (deadlock) означает ситуацию, когда две или более нити (потока исполнения) блокируются и ожидают ресурсы, которые удерживают друг друга, что приводит к тому, что ни одна из них не может продолжить свою работу. В итоге программа оказывается в застойном состоянии, так как нити блокируют друг друга и не могут разблокироваться без внешнего вмешательства.

Чтобы избежать мёртвой нити, следует стремиться к тому, чтобы нити блокировали ресурсы в одном и том же порядке. Если это невозможно, можно использовать техники, такие как использование метода tryLock() из java.util.concurrent.locks.Lock, которые позволяют более гибко управлять блокировками и избегать мёртвой нити.

#для_начинающих
👍9🔥1😱1
Монитор

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

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

#для_продвинутых
👍10
DelayQueue

DelayQueue - это тип очереди, который используется для задержки выполнения определенных операций.

DelayQueue хранит элементы, реализующие интерфейс Delayed. Этот интерфейс позволяет определить время задержки для каждого элемента.

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

В этом примере мы добавляем в очередь два сообщения с разными задержками. Первое сообщение выводится через 5 секунд, второе - сразу же.
👍11
interrupted()

Метод interrupted() является статическим методом класса Thread и проверяет, был ли установлен флаг прерывания у текущего потока. При этом флаг прерывания после вызова этого метода сбрасывается.

В этом примере создается новый поток, который выполняет цикл while, пока флаг прерывания не установлен. Затем главный поток останавливается с помощью sleep(), после чего вызывается метод interrupt() для нового потока, чтобы установить флаг прерывания. Когда флаг прерывания установлен, цикл while завершается и выводится сообщение "Thread has been interrupted".

Количество строк "Thread is running" может отличаться в зависимости от скорости выполнения кода.
👍6
Что такое «IS-A» отношение?

«IS-A» отношение относится к понятию наследования и полиморфизма в объектно-ориентированном программировании. Оно также называется «является типом» или «является подтипом». Это отношение указывает на то, что один класс является подклассом другого класса.

Наследование позволяет создавать новый класс на основе существующего класса. Подкласс наследует поля и методы суперкласса, что позволяет расширять функциональность и переиспользовать код. «IS-A» отношение означает, что объекты подкласса могут быть рассматриваемыми как объекты суперкласса, так как они наследуют его свойства и методы.

#для_продвинутых
👍92
Что такое Executor?

Понятие Executor относится к части библиотеки java.util.concurrent, которая предоставляет управление и выполнение задач в многопоточных приложениях. Этот интерфейс и связанные с ним классы предоставляют абстракцию для управления выполнением потоковых задач.

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

#для_начинающих
👍11
ScheduledExecutorService

ScheduledExecutorService — это интерфейс в Java из пакета java.util.concurrent, который предоставляет возможность планирования и выполнения задач с задержкой или периодически.

Основные реализации ScheduledExecutorService:

ScheduledThreadPoolExecutor — это конкретная реализация ScheduledExecutorService, предоставляемая в стандартной библиотеке Java. Она является потокобезопасной реализацией и использует пул потоков для выполнения задач.

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

#для_начинающих
👍9
Декартово произведение

Декартово произведение (cartesian product) в математике означает комбинацию всех возможных пар элементов из двух множеств. В Java это понятие может использоваться для описания ситуации, когда необходимо создать все возможные комбинации элементов из двух или более наборов данных.

Например, представьте, что у вас есть два множества: A = {1, 2} и B = {a, b}. Декартово произведение этих множеств будет: {(1, a), (1, b), (2, a), (2, b)}.

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

Для решения проблемы декартова произведения можно использовать вложенные циклы, рекурсию или специализированные библиотеки, такие как Apache Commons Collections или Stream API, чтобы более эффективно генерировать и обрабатывать комбинации элементов из разных множеств.

#для_продвинутых
👍10