High cohesion
High cohesion (высокая связанность) — это принцип проектирования программного обеспечения, который означает, что компонент или модуль программы должен иметь чёткую и ограниченную ответственность, а все его функции и элементы должны быть связаны логически и тесно между собой. Это позволяет создать более структурированный и легко поддерживаемый код.
В Java принцип высокой связанности можно применить, следуя ряду практик:
1. Разделение функциональности
2. Ограниченная ответственность
3. Минимизация зависимостей
4. Принцип единственной ответственности (Single Responsibility Principle)
5. Группировка по функциональности
#для_продвинутых
High cohesion (высокая связанность) — это принцип проектирования программного обеспечения, который означает, что компонент или модуль программы должен иметь чёткую и ограниченную ответственность, а все его функции и элементы должны быть связаны логически и тесно между собой. Это позволяет создать более структурированный и легко поддерживаемый код.
В Java принцип высокой связанности можно применить, следуя ряду практик:
1. Разделение функциональности
2. Ограниченная ответственность
3. Минимизация зависимостей
4. Принцип единственной ответственности (Single Responsibility Principle)
5. Группировка по функциональности
#для_продвинутых
👍6❤1
Метод clone()
Метод
Однако следует помнить, что метод clone() выполняет поверхностное копирование только для примитивных типов данных и ссылок на объекты. Для глубокого клонирования, то есть создания копии объекта и всех его вложенных объектов, вам потребуется реализовать собственную логику клонирования, чтобы гарантировать, что все вложенные объекты также будут скопированы.
#для_начинающих
Метод
clone() предназначен для создания поверхностной копии (shallow copy) объекта. Это означает, что он создает новый объект, который является копией исходного объекта, но содержит ссылки на те же самые объекты внутри, что и исходный объект. Процесс клонирования выполняется с помощью реализации интерфейса Cloneable.Однако следует помнить, что метод clone() выполняет поверхностное копирование только для примитивных типов данных и ссылок на объекты. Для глубокого клонирования, то есть создания копии объекта и всех его вложенных объектов, вам потребуется реализовать собственную логику клонирования, чтобы гарантировать, что все вложенные объекты также будут скопированы.
#для_начинающих
👍6
Прокси-объект
Прокси-объект (Proxy Object) — это объект, который действует как промежуточный слой между клиентским кодом и реальным объектом. Прокси-объект позволяет выполнять дополнительные действия перед или после вызовов методов реального объекта, а также контролировать доступ к этим методам.
Прокси-объекты в Java реализуются с помощью интерфейсов и динамического создания классов во время выполнения. Для создания прокси-объекта в Java существует два основных способа: с использованием JDK Proxy и с использованием библиотеки CGLIB.
#для_продвинутых
Прокси-объект (Proxy Object) — это объект, который действует как промежуточный слой между клиентским кодом и реальным объектом. Прокси-объект позволяет выполнять дополнительные действия перед или после вызовов методов реального объекта, а также контролировать доступ к этим методам.
Прокси-объекты в Java реализуются с помощью интерфейсов и динамического создания классов во время выполнения. Для создания прокси-объекта в Java существует два основных способа: с использованием JDK Proxy и с использованием библиотеки CGLIB.
#для_продвинутых
👍8
👍20❤2
Фундаментальное руководство по пакетам в Java
Java-пакеты реализуют так называемое пространство имен (namespace), позволяющее использовать в проекте файлы с одинаковыми именами.
Смотреть статью
Java-пакеты реализуют так называемое пространство имен (namespace), позволяющее использовать в проекте файлы с одинаковыми именами.
Смотреть статью
👍6❤3
Ковариантность типов
Ковариантность типов — это вариантность типов в системе типов языка программирования. Ковариантность означает, что типы могут быть связаны отношением «родитель-потомок» в иерархии классов или интерфейсов, и этот относительный порядок сохраняется при передаче аргументов методам или возвращении значений из методов. Другими словами, ковариантность позволяет использовать подтип (потомок) вместо его родителя без необходимости явного приведения типов.
#для_начинающих
Ковариантность типов — это вариантность типов в системе типов языка программирования. Ковариантность означает, что типы могут быть связаны отношением «родитель-потомок» в иерархии классов или интерфейсов, и этот относительный порядок сохраняется при передаче аргументов методам или возвращении значений из методов. Другими словами, ковариантность позволяет использовать подтип (потомок) вместо его родителя без необходимости явного приведения типов.
#для_начинающих
👍15❤1
Что такое «fail-fast поведение»?
Fail-fast поведение (fail-fast behavior) — это принцип в программировании, который подразумевает, что программа должна обнаруживать ошибки и некорректные условия как можно раньше и немедленно генерировать исключения или останавливать выполнение, чтобы предотвратить дальнейшие некорректные операции и минимизировать возможные повреждения данных или неправильное поведение программы.
В Java fail-fast поведение реализуется с использованием механизмов. Если в процессе выполнения программы обнаруживается какое-либо нарушение, например, попытка доступа за пределы массива или передача недопустимого аргумента в метод, генерируется исключение, и выполнение программы прерывается.
#для_продвинутых
Fail-fast поведение (fail-fast behavior) — это принцип в программировании, который подразумевает, что программа должна обнаруживать ошибки и некорректные условия как можно раньше и немедленно генерировать исключения или останавливать выполнение, чтобы предотвратить дальнейшие некорректные операции и минимизировать возможные повреждения данных или неправильное поведение программы.
В Java fail-fast поведение реализуется с использованием механизмов. Если в процессе выполнения программы обнаруживается какое-либо нарушение, например, попытка доступа за пределы массива или передача недопустимого аргумента в метод, генерируется исключение, и выполнение программы прерывается.
#для_продвинутых
👍8
Прямой обход дерева
Прямой обход дерева (pre-order traversal) — это один из способов обхода бинарного дерева. В этом способе сначала посещается корневой узел, затем левое поддерево и затем правое поддерево. Прямой обход широко используется для вывода структуры дерева и выполнения операций на каждом узле в нужном порядке.
#для_продвинутых
Прямой обход дерева (pre-order traversal) — это один из способов обхода бинарного дерева. В этом способе сначала посещается корневой узел, затем левое поддерево и затем правое поддерево. Прямой обход широко используется для вывода структуры дерева и выполнения операций на каждом узле в нужном порядке.
#для_продвинутых
👍10
Мёртвая нить
Мёртвая нить (deadlock) означает ситуацию, когда две или более нити (потока исполнения) блокируются и ожидают ресурсы, которые удерживают друг друга, что приводит к тому, что ни одна из них не может продолжить свою работу. В итоге программа оказывается в застойном состоянии, так как нити блокируют друг друга и не могут разблокироваться без внешнего вмешательства.
Чтобы избежать мёртвой нити, следует стремиться к тому, чтобы нити блокировали ресурсы в одном и том же порядке. Если это невозможно, можно использовать техники, такие как использование метода
#для_начинающих
Мёртвая нить (deadlock) означает ситуацию, когда две или более нити (потока исполнения) блокируются и ожидают ресурсы, которые удерживают друг друга, что приводит к тому, что ни одна из них не может продолжить свою работу. В итоге программа оказывается в застойном состоянии, так как нити блокируют друг друга и не могут разблокироваться без внешнего вмешательства.
Чтобы избежать мёртвой нити, следует стремиться к тому, чтобы нити блокировали ресурсы в одном и том же порядке. Если это невозможно, можно использовать техники, такие как использование метода
tryLock() из java.util.concurrent.locks.Lock, которые позволяют более гибко управлять блокировками и избегать мёртвой нити.#для_начинающих
👍9🔥1😱1
Монитор
Монитор представляет собой механизм, который обеспечивает синхронизированный доступ к критическим секциям кода, что позволяет избежать состояния гонки (race condition) и обеспечивает координацию между потоками.
Ключевое слово
#для_продвинутых
Монитор представляет собой механизм, который обеспечивает синхронизированный доступ к критическим секциям кода, что позволяет избежать состояния гонки (race condition) и обеспечивает координацию между потоками.
Ключевое слово
synchronized может быть применено к методам или блокам кода. Когда метод или блок кода помечен как synchronized, только один поток может выполнить этот код или метод в определенный момент времени. Если другой поток попытается войти в синхронизированный блок или вызвать синхронизированный метод, он будет ожидать, пока первый поток не завершит выполнение.#для_продвинутых
👍10
DelayQueue
DelayQueue - это тип очереди, который используется для задержки выполнения определенных операций.
DelayQueue хранит элементы, реализующие интерфейс Delayed. Этот интерфейс позволяет определить время задержки для каждого элемента.
Элементы извлекаются из очереди только по истечении их времени задержки.
DelayQueue реализует интерфейс BlockingQueue, поэтому извлечение элементов блокируется, если очередь пуста.
В этом примере мы добавляем в очередь два сообщения с разными задержками. Первое сообщение выводится через 5 секунд, второе - сразу же.
DelayQueue - это тип очереди, который используется для задержки выполнения определенных операций.
DelayQueue хранит элементы, реализующие интерфейс Delayed. Этот интерфейс позволяет определить время задержки для каждого элемента.
Элементы извлекаются из очереди только по истечении их времени задержки.
DelayQueue реализует интерфейс BlockingQueue, поэтому извлечение элементов блокируется, если очередь пуста.
В этом примере мы добавляем в очередь два сообщения с разными задержками. Первое сообщение выводится через 5 секунд, второе - сразу же.
👍11
interrupted()
Метод interrupted() является статическим методом класса Thread и проверяет, был ли установлен флаг прерывания у текущего потока. При этом флаг прерывания после вызова этого метода сбрасывается.
В этом примере создается новый поток, который выполняет цикл while, пока флаг прерывания не установлен. Затем главный поток останавливается с помощью sleep(), после чего вызывается метод interrupt() для нового потока, чтобы установить флаг прерывания. Когда флаг прерывания установлен, цикл while завершается и выводится сообщение "Thread has been interrupted".
Количество строк "Thread is running" может отличаться в зависимости от скорости выполнения кода.
Метод interrupted() является статическим методом класса Thread и проверяет, был ли установлен флаг прерывания у текущего потока. При этом флаг прерывания после вызова этого метода сбрасывается.
В этом примере создается новый поток, который выполняет цикл while, пока флаг прерывания не установлен. Затем главный поток останавливается с помощью sleep(), после чего вызывается метод interrupt() для нового потока, чтобы установить флаг прерывания. Когда флаг прерывания установлен, цикл while завершается и выводится сообщение "Thread has been interrupted".
Количество строк "Thread is running" может отличаться в зависимости от скорости выполнения кода.
👍6
Что такое «IS-A» отношение?
«IS-A» отношение относится к понятию наследования и полиморфизма в объектно-ориентированном программировании. Оно также называется «является типом» или «является подтипом». Это отношение указывает на то, что один класс является подклассом другого класса.
Наследование позволяет создавать новый класс на основе существующего класса. Подкласс наследует поля и методы суперкласса, что позволяет расширять функциональность и переиспользовать код. «IS-A» отношение означает, что объекты подкласса могут быть рассматриваемыми как объекты суперкласса, так как они наследуют его свойства и методы.
#для_продвинутых
«IS-A» отношение относится к понятию наследования и полиморфизма в объектно-ориентированном программировании. Оно также называется «является типом» или «является подтипом». Это отношение указывает на то, что один класс является подклассом другого класса.
Наследование позволяет создавать новый класс на основе существующего класса. Подкласс наследует поля и методы суперкласса, что позволяет расширять функциональность и переиспользовать код. «IS-A» отношение означает, что объекты подкласса могут быть рассматриваемыми как объекты суперкласса, так как они наследуют его свойства и методы.
#для_продвинутых
👍9❤2
Что такое 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, чтобы более эффективно генерировать и обрабатывать комбинации элементов из разных множеств.
#для_продвинутых
Декартово произведение (cartesian product) в математике означает комбинацию всех возможных пар элементов из двух множеств. В Java это понятие может использоваться для описания ситуации, когда необходимо создать все возможные комбинации элементов из двух или более наборов данных.
Например, представьте, что у вас есть два множества: A = {1, 2} и B = {a, b}. Декартово произведение этих множеств будет: {(1, a), (1, b), (2, a), (2, b)}.
Проблема декартова произведения может возникнуть, когда вам нужно сгенерировать или обработать все возможные комбинации элементов из двух или более коллекций.
Для решения проблемы декартова произведения можно использовать вложенные циклы, рекурсию или специализированные библиотеки, такие как Apache Commons Collections или Stream API, чтобы более эффективно генерировать и обрабатывать комбинации элементов из разных множеств.
#для_продвинутых
👍10
Что такое ThreadGroup?
#для_продвинутых
ThreadGroup представляет собой класс, предоставляемый Java для создания и управления группами потоков. Он может содержать другие подгруппы потоков, образуя иерархию. Основной целью ThreadGroup является обеспечение единого механизма управления и мониторинга для всех потоков внутри группы.ThreadGroup предоставляет некоторый уровень организации и управления, но в большинстве современных приложений управление потоками осуществляется с использованием более высокоуровневых конструкций, таких как классы из пакета java.util.concurrent, которые предоставляют более гибкие и безопасные средства для работы с параллельным исполнением.#для_продвинутых
👍7😱2
Конкатенация
Конкатенация — это операция объединения или склеивания двух или более строк или последовательностей символов для создания новой строки. В общем смысле, это означает соединение элементов в одну последовательность. Этот термин применяется не только к строкам, но и к другим типам данных, которые могут быть объединены.
#для_начинающих
Конкатенация — это операция объединения или склеивания двух или более строк или последовательностей символов для создания новой строки. В общем смысле, это означает соединение элементов в одну последовательность. Этот термин применяется не только к строкам, но и к другим типам данных, которые могут быть объединены.
#для_начинающих
👍11
serialVersionUID
Проблема, которую
#для_продвинутых
serialVersionUID — это статическое поле, которое используется для версионирования сериализованных объектов. Когда объекты сериализуются, serialVersionUID указывает версию класса, используемую при сериализации и десериализации.Проблема, которую
serialVersionUID решает, связана с обеспечением совместимости при сериализации. Если класс был сериализован с определенной версией serialVersionUID, то при десериализации Java будет проверять, соответствует ли текущая версия класса версии, сохраненной в сериализованных данных. Если версии не совпадают, может быть брошено исключение InvalidClassException, указывающее на несовместимость версий.#для_продвинутых
👍9