Паттерн "Стратегия"
Представьте что у вас есть класс фермы Farm, который обрабатывает классы Cow, Pig и Chicken. Чтобы хранить их в классе нам нужен массив для них, но в статической Java невозможно сделать массив для разных типо.
Для решения этой ситуации создают интерфейс Animal, который будет имплементироваться всеми классами животных.
Далее в классе Farm делаем массив типо Animal[], который может хранить в себе любое животное. Это и есть паттерн стратегия.
#java #lesson #patterns
Представьте что у вас есть класс фермы Farm, который обрабатывает классы Cow, Pig и Chicken. Чтобы хранить их в классе нам нужен массив для них, но в статической Java невозможно сделать массив для разных типо.
Для решения этой ситуации создают интерфейс Animal, который будет имплементироваться всеми классами животных.
Далее в классе Farm делаем массив типо Animal[], который может хранить в себе любое животное. Это и есть паттерн стратегия.
#java #lesson #patterns
Юнит и интеграционные тесты
Юнит-тестирование предусматривает тестирование конкретных объектов и их методов по отдельности. Такой тип тестов легко писать и с ними легче найти конкретное место появления ошибки.
Интеграционное тестирование тестирует как разные объекты взаимодействуют друг с другом. Глобально такие тесты считаются полезнее и надёжнее, так как тестируют саму суть работы программы.
#java #lesson #theory
Юнит-тестирование предусматривает тестирование конкретных объектов и их методов по отдельности. Такой тип тестов легко писать и с ними легче найти конкретное место появления ошибки.
Интеграционное тестирование тестирует как разные объекты взаимодействуют друг с другом. Глобально такие тесты считаются полезнее и надёжнее, так как тестируют саму суть работы программы.
#java #lesson #theory
Нейронные сети с KepoJ
На сегодняшний день всё больше набирает популярность машинное обучение и нейронные сети, особенно на таких языках как Java и Python.
Как раз в этой области специализируется KepoJ. С помощью этой библиотеки можно создавать и обрабатывать нейронные сети в пару кликов.
Для использования нужно лишь вписать dependency в
Библиотека
#java #lesson #library
На сегодняшний день всё больше набирает популярность машинное обучение и нейронные сети, особенно на таких языках как Java и Python.
Как раз в этой области специализируется KepoJ. С помощью этой библиотеки можно создавать и обрабатывать нейронные сети в пару кликов.
Для использования нужно лишь вписать dependency в
pom.xml
вашего проекта. KepoJ также имеет краткий гайд и полную документацию.Библиотека
#java #lesson #library
Обмен данными между потоками
Класс Exchanger предназначен для обмена данными между потоками. Он является типизированным и типизируется типом данных, которыми потоки должны обмениваться.
По своей сути это буфер, в который можно положить что-то, и вернуть то, что в нём было до этого. Реализуться это методом exchange():
Класс Exchanger предназначен для обмена данными между потоками. Он является типизированным и типизируется типом данных, которыми потоки должны обмениваться.
По своей сути это буфер, в который можно положить что-то, и вернуть то, что в нём было до этого. Реализуться это методом exchange():
T exchange(T x) throws InterruptedException
#java #lesson #threadsРабота с датами LocalDateTime
Класс LocalDateTime из пакета java.time позволяет создавать даты и изменять их, добавляя и отнимая необходимое количество часов, дней, месяцев, лет и даже эпох.
Чтобы получить текущую дату на вашем устройстве достаточно вызвать метод LocalDateTime::now.
Зеркалом этого класса в JDBC является класс TimeStamp, в который можно перевести методом of().
#java #lesson #features
Класс LocalDateTime из пакета java.time позволяет создавать даты и изменять их, добавляя и отнимая необходимое количество часов, дней, месяцев, лет и даже эпох.
Чтобы получить текущую дату на вашем устройстве достаточно вызвать метод LocalDateTime::now.
Зеркалом этого класса в JDBC является класс TimeStamp, в который можно перевести методом of().
#java #lesson #features
Оператор instanceof
Прежде чем приводить объект к определённому типу стоит проверить, а является ли он этим типом. А то превратите курицу в кошку.
Он может быть использован для перевода абстрактного Object в какой-то определённый объект (Cat) и последующей работы с ним.
#java #lesson #operators
Прежде чем приводить объект к определённому типу стоит проверить, а является ли он этим типом. А то превратите курицу в кошку.
Он может быть использован для перевода абстрактного Object в какой-то определённый объект (Cat) и последующей работы с ним.
#java #lesson #operators
StringBuffer и StringBuilder
Вы знаете, что каждый раз, когда вы изменяете строку, на самом деле, создаётся новая строка? Это приводит к небольшим проблем с оптимизацией.
Если так получается, что строка часто меняется, то используйте StringBuilder. Если вам нужна многопоточная версия — StringBuffer.
Он помогает справиться с созданием временного мусора из-за модификаций объекта String.
#java #lesson #string
Вы знаете, что каждый раз, когда вы изменяете строку, на самом деле, создаётся новая строка? Это приводит к небольшим проблем с оптимизацией.
Если так получается, что строка часто меняется, то используйте StringBuilder. Если вам нужна многопоточная версия — StringBuffer.
Он помогает справиться с созданием временного мусора из-за модификаций объекта String.
#java #lesson #string
Лямбда-выражение
Вам нужна функция, которая больше нигде не пригодится и выполняет одно простое действие. Но ради этого надо будет создать отдельную функцию... Или нет.
Лямбда выражения позволяют определить функцию с одним действием в строку, а также вам не придётся думать над именем.
Создаётся она так:
#java #lesson #features
Вам нужна функция, которая больше нигде не пригодится и выполняет одно простое действие. Но ради этого надо будет создать отдельную функцию... Или нет.
Лямбда выражения позволяют определить функцию с одним действием в строку, а также вам не придётся думать над именем.
Создаётся она так:
(type1 arg1,type2 arg2) -> expression
, где arg1 и arg2 - аргументы функции, а expression
— действие, которое надо выполнить.#java #lesson #features
Очередь в Java
Описать работу очереди можно одной фразой: «Первый вошёл — последний вышел». Другими словами, элементы добавление первые в очередь будут получены первые остальных.
Для реализации очередей в Java есть интерфейс Queue<E> и метод pull(), который удаляет первый элемент в очереди и возвращает его.
#java #lesson #collections
Описать работу очереди можно одной фразой: «Первый вошёл — последний вышел». Другими словами, элементы добавление первые в очередь будут получены первые остальных.
Для реализации очередей в Java есть интерфейс Queue<E> и метод pull(), который удаляет первый элемент в очереди и возвращает его.
#java #lesson #collections
Выбрасываем исключения
Кто-то передал функции null? Давайте скажем об этом. Или заставил считать площадь квадрата с отрицательной стороной? Выдаём ошибку и перестаём работать!
Чтобы выдать исключение используется throw вместе с исключением, которое мы хотим выдать. Например, IllegalArgumentException.
Главное не забудьте написать после определения функции throws ExceptionType, иначе ничего не заработает.
#java #lesson #exception
Кто-то передал функции null? Давайте скажем об этом. Или заставил считать площадь квадрата с отрицательной стороной? Выдаём ошибку и перестаём работать!
Чтобы выдать исключение используется throw вместе с исключением, которое мы хотим выдать. Например, IllegalArgumentException.
Главное не забудьте написать после определения функции throws ExceptionType, иначе ничего не заработает.
#java #lesson #exception
Итераторы
Это объекты, по которым можно "пройтись". Итератором считается объект, который реализовал интерфейс
Такие итераторы можно получить, например, у ArrayList, поскольку он реализует Collection, а значит у него есть метод
#java #lesson #collections
Это объекты, по которым можно "пройтись". Итератором считается объект, который реализовал интерфейс
Iterator <E>
. Такие итераторы можно получить, например, у ArrayList, поскольку он реализует Collection, а значит у него есть метод
Iterator<E> iterator()
. #java #lesson #collections
Константа
Помимо переменных в Java данные можно хранить в константах. Язык не разрешает менять эти значения. Но зачем они тогда нужны, почему нельзя просто написать число?
Магические числа это плохая практика, поэтому мы даём им имена в виде констант. Не 0, а SUCCESSEXITCODE.
Или, например, число pi. которое мы можем заново использовать, а не вводить каждый раз 3.14...
#java #lesson #vars
Помимо переменных в Java данные можно хранить в константах. Язык не разрешает менять эти значения. Но зачем они тогда нужны, почему нельзя просто написать число?
Магические числа это плохая практика, поэтому мы даём им имена в виде констант. Не 0, а SUCCESSEXITCODE.
Или, например, число pi. которое мы можем заново использовать, а не вводить каждый раз 3.14...
#java #lesson #vars
Ключевое слово var
Начиная с Java 10 в язык было добавлено слово var, которое позволяет определить переменную, на записывая тип.
Нет, это не динамическая типизация, просто язык сам просчитывает тип переменной на основе того, что в неё записали.
В таком случае переменную обязательно надо инициализировать, иначе выдаст ошибку.
#java #lesson #vars
Начиная с Java 10 в язык было добавлено слово var, которое позволяет определить переменную, на записывая тип.
Нет, это не динамическая типизация, просто язык сам просчитывает тип переменной на основе того, что в неё записали.
В таком случае переменную обязательно надо инициализировать, иначе выдаст ошибку.
#java #lesson #vars
InterruptedException
Думаю, вы заметили, что мы везде обрабатываем эту ошибку. Пока поток ожидает, кто-то может прервать его работу.
Ещё можно приостановить работу во время выполнения какого-то действия за счёт проверки
#java #lesson #multithreading
Думаю, вы заметили, что мы везде обрабатываем эту ошибку. Пока поток ожидает, кто-то может прервать его работу.
Thread.stop()
это устаревший метод, который просто убивал поток. Сейчас есть Thread.interrupt()
который говорит, что потоку надо закончить работу.Ещё можно приостановить работу во время выполнения какого-то действия за счёт проверки
!Thread.currentThread().isInterrupted()
.#java #lesson #multithreading
Создание потока
Для этого вам нужно создать новый класс и унаследовать его от класса Thread или от интерфейса Runnable.
Первый вариант не очень, поскольку нарушает принцип SOLID и добавляет в иерархию классов Thread.
Поэтому лучше всего использовать Runnable. К тому же, его можно определять как лямбду, как на фото выше.
#java #lesson #multithreading
Для этого вам нужно создать новый класс и унаследовать его от класса Thread или от интерфейса Runnable.
Первый вариант не очень, поскольку нарушает принцип SOLID и добавляет в иерархию классов Thread.
Поэтому лучше всего использовать Runnable. К тому же, его можно определять как лямбду, как на фото выше.
#java #lesson #multithreading
Синхронизация потоков
Потоки, как ни крути, работают с памятью и бывает такое, что два потока могут одновременно обратится и/или изменить один и тот же объект.
Это может привести к ошибке согласованности памяти. Самое простое решение — использовать synchronized.
#java #lesson #multithreading
Потоки, как ни крути, работают с памятью и бывает такое, что два потока могут одновременно обратится и/или изменить один и тот же объект.
Это может привести к ошибке согласованности памяти. Самое простое решение — использовать synchronized.
#java #lesson #multithreading
Жизненный цикл потока
Поток в процессе жизни меняет свой статус. Как только он создан, поток обретает статус NEW.
После того, как мы вызывали
Когда поток жив, но не активен, то статус или BLOCKED (из-за synchonized), или WAITING (
Если поток больше не выполняется (завершился успешно или с ошибкой), то получает TERMINATED.
Узнать состояние потока сейчас можно с
#java #lesson #multithreading
Поток в процессе жизни меняет свой статус. Как только он создан, поток обретает статус NEW.
После того, как мы вызывали
thread.start()
, он обретает состояние RUNNABLE. Когда поток жив, но не активен, то статус или BLOCKED (из-за synchonized), или WAITING (
Thread.join()
), или TIMED_WAITING (thread.sleep()
).Если поток больше не выполняется (завершился успешно или с ошибкой), то получает TERMINATED.
Узнать состояние потока сейчас можно с
thread.getState()
.#java #lesson #multithreading