Java Portal | Программирование
11.3K subscribers
798 photos
59 videos
19 files
591 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
加入频道
Паттерн "Стратегия"

Представьте что у вас есть класс фермы Farm, который обрабатывает классы Cow, Pig и Chicken. Чтобы хранить их в классе нам нужен массив для них, но в статической Java невозможно сделать массив для разных типо.

Для решения этой ситуации создают интерфейс Animal, который будет имплементироваться всеми классами животных.

Далее в классе Farm делаем массив типо Animal[], который может хранить в себе любое животное. Это и есть паттерн стратегия.

#java #lesson #patterns
Юнит и интеграционные тесты

Юнит-тестирование
предусматривает тестирование конкретных объектов и их методов по отдельности. Такой тип тестов легко писать и с ними легче найти конкретное место появления ошибки.

Интеграционное тестирование тестирует как разные объекты взаимодействуют друг с другом. Глобально такие тесты считаются полезнее и надёжнее, так как тестируют саму суть работы программы.

#java #lesson #theory
String.join

Метод String.join склеивает все входящие в него строки, вставляя между ними разделитель.

Синтаксис: String.join(String delimiter, String... strings)

#lesson #method
BigInteger и BigDecimal

Примитивные числовые типы не всегда могут подходить по размерам для некоторых задач.

Для решения этой проблемы существуют объекты BigInteger и BigDecimal. Каждый из них может хранить числа абсолютно любого размера и производить математические операции.

#java #lesson #features
Нейронные сети с KepoJ

На сегодняшний день всё больше набирает популярность машинное обучение и нейронные сети, особенно на таких языках как Java и Python.

Как раз в этой области специализируется KepoJ. С помощью этой библиотеки можно создавать и обрабатывать нейронные сети в пару кликов.

Для использования нужно лишь вписать dependency в pom.xml вашего проекта. KepoJ также имеет краткий гайд и полную документацию.

Библиотека

#java #lesson #library
Обмен данными между потоками

Класс Exchanger предназначен для обмена данными между потоками. Он является типизированным и типизируется типом данных, которыми потоки должны обмениваться.

По своей сути это буфер, в который можно положить что-то, и вернуть то, что в нём было до этого. Реализуться это методом exchange():

T exchange(T x) throws InterruptedException

#java #lesson #threads
Работа с датами LocalDateTime

Класс LocalDateTime из пакета java.time позволяет создавать даты и изменять их, добавляя и отнимая необходимое количество часов, дней, месяцев, лет и даже эпох.

Чтобы получить текущую дату на вашем устройстве достаточно вызвать метод LocalDateTime::now.

Зеркалом этого класса в JDBC является класс TimeStamp, в который можно перевести методом of().

#java #lesson #features
Оператор instanceof

Прежде чем приводить объект к определённому типу стоит проверить, а является ли он этим типом. А то превратите курицу в кошку.

Он может быть использован для перевода абстрактного Object в какой-то определённый объект (Cat) и последующей работы с ним.

#java #lesson #operators
HashMap vs HashTable

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

Если это не так, смело применяйте HashMap. Он быстрее в одном потоке, принимает null и лучше.

#java #lesson #features
Float vs Double

Оба эти типа данных представляют числа с плавающей запятой. А то, что double является более точным, является общеизвестным фактом.

Настоятельно рекомендуется использовать double вместо float. Но помните, что у всего есть цена, double требует в два раза больше памяти.

#java #lesson
StringBuffer и StringBuilder

Вы знаете, что каждый раз, когда вы изменяете строку, на самом деле, создаётся новая строка? Это приводит к небольшим проблем с оптимизацией.

Если так получается, что строка часто меняется, то используйте StringBuilder. Если вам нужна многопоточная версия — StringBuffer.

Он помогает справиться с созданием временного мусора из-за модификаций объекта String.

#java #lesson #string
Лямбда-выражение

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

Лямбда выражения позволяют определить функцию с одним действием в строку, а также вам не придётся думать над именем.

Создаётся она так: (type1 arg1,type2 arg2) -> expression, где arg1 и arg2 - аргументы функции, а expression — действие, которое надо выполнить.

#java #lesson #features
Очередь в Java

Описать работу очереди можно одной фразой: «Первый вошёл — последний вышел». Другими словами, элементы добавление первые в очередь будут получены первые остальных.

Для реализации очередей в Java есть интерфейс Queue<E> и метод pull(), который удаляет первый элемент в очереди и возвращает его.

#java #lesson #collections
Выбрасываем исключения

Кто-то передал функции null? Давайте скажем об этом. Или заставил считать площадь квадрата с отрицательной стороной? Выдаём ошибку и перестаём работать!

Чтобы выдать исключение используется throw вместе с исключением, которое мы хотим выдать. Например, IllegalArgumentException.

Главное не забудьте написать после определения функции throws ExceptionType, иначе ничего не заработает.

#java #lesson #exception
Итераторы

Это объекты, по которым можно "пройтись". Итератором считается объект, который реализовал интерфейс Iterator <E>.

Такие итераторы можно получить, например, у ArrayList, поскольку он реализует Collection, а значит у него есть метод Iterator<E> iterator().

#java #lesson #collections
Константа

Помимо переменных в Java данные можно хранить в константах. Язык не разрешает менять эти значения. Но зачем они тогда нужны, почему нельзя просто написать число?

Магические числа это плохая практика, поэтому мы даём им имена в виде констант. Не 0, а SUCCESSEXITCODE.

Или, например, число pi. которое мы можем заново использовать, а не вводить каждый раз 3.14...

#java #lesson #vars
Ключевое слово var

Начиная с Java 10 в язык было добавлено слово var, которое позволяет определить переменную, на записывая тип.

Нет, это не динамическая типизация, просто язык сам просчитывает тип переменной на основе того, что в неё записали.

В таком случае переменную обязательно надо инициализировать, иначе выдаст ошибку.

#java #lesson #vars
InterruptedException

Думаю, вы заметили, что мы везде обрабатываем эту ошибку. Пока поток ожидает, кто-то может прервать его работу.

Thread.stop() это устаревший метод, который просто убивал поток. Сейчас есть Thread.interrupt() который говорит, что потоку надо закончить работу.

Ещё можно приостановить работу во время выполнения какого-то действия за счёт проверки !Thread.currentThread().isInterrupted().

#java #lesson #multithreading
Создание потока

Для этого вам нужно создать новый класс и унаследовать его от класса Thread или от интерфейса Runnable.

Первый вариант не очень, поскольку нарушает принцип SOLID и добавляет в иерархию классов Thread.

Поэтому лучше всего использовать Runnable. К тому же, его можно определять как лямбду, как на фото выше.

#java #lesson #multithreading
Синхронизация потоков

Потоки, как ни крути, работают с памятью и бывает такое, что два потока могут одновременно обратится и/или изменить один и тот же объект.

Это может привести к ошибке согласованности памяти. Самое простое решение — использовать synchronized.

#java #lesson #multithreading
Жизненный цикл потока

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

После того, как мы вызывали thread.start(), он обретает состояние RUNNABLE.

Когда поток жив, но не активен, то статус или BLOCKED (из-за synchonized), или WAITING (Thread.join()), или TIMED_WAITING (thread.sleep()).

Если поток больше не выполняется (завершился успешно или с ошибкой), то получает TERMINATED.

Узнать состояние потока сейчас можно с thread.getState().

#java #lesson #multithreading