SOLID — принципы объектно‑ориентированного программирования
SOLID — это аббревиатура пяти основных принципов проектирования в объектно‑ориентированном программировании — Single responsibility, Open-closed, Liskov substitution, Interface segregation и Dependency inversion.
В переводе на русский: принципы единственной ответственности, открытости / закрытости, подстановки Барбары Лисков, разделения интерфейса и инверсии зависимостей.
Аббревиатура SOLID была предложена Робертом Мартином, автором нескольких книг, широко известным в сообществе разработчиков. Следование принципам позволяет строить на базе ООП масштабируемые и сопровождаемые программные продукты с понятной бизнес‑логикой. Код, который написан с соблюдением принципов SOLID, проще понимать, поддерживать, расширять или изменять его функциональность.
Принцип единственной обязанности / ответственности (single responsibility principle / SRP) обозначает, что каждый объект должен иметь одну обязанность и эта обязанность должна быть полностью инкапсулирована в класс. Все его сервисы должны быть направлены исключительно на обеспечение этой обязанности.
Принцип открытости / закрытости (open-closed principle / OCP) декларирует, что программные сущности (классы, модули, функции и т. п.) должны быть открыты для расширения, но закрыты для изменения. Это означает, что эти сущности могут менять свое поведение без изменения их исходного кода.
Принцип подстановки Барбары Лисков (Liskov substitution principle / LSP) в формулировке Роберта Мартина: «функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа не зная об этом».
Принцип разделения интерфейса (interface segregation principle / ISP) в формулировке Роберта Мартина: «клиенты не должны зависеть от методов, которые они не используют». Принцип разделения интерфейсов говорит о том, что слишком «толстые» интерфейсы необходимо разделять на более маленькие и специфические, чтобы клиенты маленьких интерфейсов знали только о методах, которые необходимы им в работе. В итоге, при изменении метода интерфейса не должны меняться клиенты, которые этот метод не используют.
Принцип инверсии зависимостей (dependency inversion principle / DIP) — модули верхних уровней не должны зависеть от модулей нижних уровней, а оба типа модулей должны зависеть от абстракций; сами абстракции не должны зависеть от деталей, а вот детали должны зависеть от абстракций.
SOLID — это аббревиатура пяти основных принципов проектирования в объектно‑ориентированном программировании — Single responsibility, Open-closed, Liskov substitution, Interface segregation и Dependency inversion.
В переводе на русский: принципы единственной ответственности, открытости / закрытости, подстановки Барбары Лисков, разделения интерфейса и инверсии зависимостей.
Аббревиатура SOLID была предложена Робертом Мартином, автором нескольких книг, широко известным в сообществе разработчиков. Следование принципам позволяет строить на базе ООП масштабируемые и сопровождаемые программные продукты с понятной бизнес‑логикой. Код, который написан с соблюдением принципов SOLID, проще понимать, поддерживать, расширять или изменять его функциональность.
Принцип единственной обязанности / ответственности (single responsibility principle / SRP) обозначает, что каждый объект должен иметь одну обязанность и эта обязанность должна быть полностью инкапсулирована в класс. Все его сервисы должны быть направлены исключительно на обеспечение этой обязанности.
Принцип открытости / закрытости (open-closed principle / OCP) декларирует, что программные сущности (классы, модули, функции и т. п.) должны быть открыты для расширения, но закрыты для изменения. Это означает, что эти сущности могут менять свое поведение без изменения их исходного кода.
Принцип подстановки Барбары Лисков (Liskov substitution principle / LSP) в формулировке Роберта Мартина: «функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа не зная об этом».
Принцип разделения интерфейса (interface segregation principle / ISP) в формулировке Роберта Мартина: «клиенты не должны зависеть от методов, которые они не используют». Принцип разделения интерфейсов говорит о том, что слишком «толстые» интерфейсы необходимо разделять на более маленькие и специфические, чтобы клиенты маленьких интерфейсов знали только о методах, которые необходимы им в работе. В итоге, при изменении метода интерфейса не должны меняться клиенты, которые этот метод не используют.
Принцип инверсии зависимостей (dependency inversion principle / DIP) — модули верхних уровней не должны зависеть от модулей нижних уровней, а оба типа модулей должны зависеть от абстракций; сами абстракции не должны зависеть от деталей, а вот детали должны зависеть от абстракций.
👍17❤🔥1🔥1
public class Quest {
public static void main(String[] args) {
try {
System.out.println("Hello World");
} catch (IOException e) {
System.out.println("Error");
}
}
}Какой будет результат выполнения кода?
Anonymous Quiz
78%
Hello World
7%
Error
15%
ошибка компиляции
👍3🎉1
Модификаторы уровня доступа определяют, могут ли другие классы использовать определенное поле или вызывать определенный метод.
Существует 4 уровня доступа:
private
Указывает, что доступ возможен только в его собственном классе.
package-private (нет явного модификатора)
Указывает, что доступ только внутри своего собственного пакета.
protected
Указывает, что доступ возможен только внутри его собственного пакета (как в случае с package-private) и, кроме того, для подкласса его класса в другом пакете.
public
Указывает, что доступ возможен отовсюду.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥1😁1
JIT-компилятор
На начальном этапе выполнения программы байт-код интерпретируется JVM. Это позволяет быстро запускать программы без необходимости предварительной компиляции в машинный код.
JIT-компилятор является ключевым элементом виртуальной машины Java (JVM). Он компилирует байт-код часто вызываемых методов в машинный код во время выполнения. Следовательно, он отвечает за оптимизацию программ Java.
JVM автоматически отслеживает, какие методы выполняются. Как только метод становится пригодным для JIT-компиляции, его планируется компилировать в машинный код. Этот метод так же известен как горячий метод. Эта компиляция в машинный код происходит в отдельном потоке JVM. В результате он не прерывает выполнение текущей программы. После компиляции в машинный код, метод работает быстрее.
Таким образом, JIT-компиляция в Java позволяет достичь компромисса между портативностью байт-кода и производительностью машинного кода. Этот механизм позволяет Java-приложениям быть эффективными на различных платформах, так как байт-код может быть выполнен на любой машине, в то время как JIT-компиляция обеспечивает высокую производительность приложений в процессе их выполнения.
На начальном этапе выполнения программы байт-код интерпретируется JVM. Это позволяет быстро запускать программы без необходимости предварительной компиляции в машинный код.
JIT-компилятор является ключевым элементом виртуальной машины Java (JVM). Он компилирует байт-код часто вызываемых методов в машинный код во время выполнения. Следовательно, он отвечает за оптимизацию программ Java.
JVM автоматически отслеживает, какие методы выполняются. Как только метод становится пригодным для JIT-компиляции, его планируется компилировать в машинный код. Этот метод так же известен как горячий метод. Эта компиляция в машинный код происходит в отдельном потоке JVM. В результате он не прерывает выполнение текущей программы. После компиляции в машинный код, метод работает быстрее.
Таким образом, JIT-компиляция в Java позволяет достичь компромисса между портативностью байт-кода и производительностью машинного кода. Этот механизм позволяет Java-приложениям быть эффективными на различных платформах, так как байт-код может быть выполнен на любой машине, в то время как JIT-компиляция обеспечивает высокую производительность приложений в процессе их выполнения.
👍11❤1⚡1🔥1
В Java, Class Loader (загрузчик классов) является частью Java Runtime Environment (JRE), которая ответственна за загрузку классов в виртуальную машину Java (JVM) во время выполнения программы. Class Loader осуществляет поиск и загрузку классов в память JVM по их именам.
Class Loader имеет иерархическую структуру и состоит из трех основных типов:
1️⃣ Bootstrap Class Loader (Загрузчик базовых классов): Этот загрузчик является частью ядра JVM и отвечает за загрузку системных классов Java, таких как
java.lang.Object, java.lang.String и другие. Он является самым высоким в иерархии загрузчиком.2️⃣ Extension Class Loader (Загрузчик расширений): Этот загрузчик наследуется от Bootstrap Class Loader и загружает классы из расширенной библиотеки Java (расположенной в директории jre/lib/ext).
3️⃣ Application Class Loader (Загрузчик приложений): Также известный как System Class Loader, этот загрузчик загружает классы из путей, указанных в переменной окружения CLASSPATH. Он также загружает классы из текущего рабочего каталога приложения.
Когда Java-программа запускается, система Class Loader следует иерархии загрузки классов. Если класс не найден в одном загрузчике, система пытается найти его в следующем в иерархии.
Процесс загрузки класса включает в себя три этапа:
1️⃣ Загрузка (Loading): Загрузчик находит байт-код класса и загружает его в память.
2️⃣ Связывание (Linking): На этом этапе проводится проверка байт-кода, выделение памяти для статических полей, и разрешение ссылок на другие классы.
3️⃣ Инициализация (Initialization): Выполняются статические блоки кода и инициализируются статические переменные.
Класс ClassLoader предоставляет методы для динамической загрузки классов во время выполнения. Работа с Class Loader'ами может быть полезной, например, при реализации механизмов плагинов и динамической загрузки классов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2🔥2👎1
Метод dropWhile был введен в интерфейсе Stream в JDK 9. Этот метод позволяет пропускать элементы в начале потока данных, пока они удовлетворяют определенному условию, и возвращает новый поток, начиная с первого элемента, который не соответствует условию.
В нашем примере метод dropWhile используется для пропуска элементов в потоке до тех пор, пока они меньше 0. После первого элемента, не соответствующего условию, оставшиеся элементы добавляются в новый поток.
В нашем примере метод dropWhile используется для пропуска элементов в потоке до тех пор, пока они меньше 0. После первого элемента, не соответствующего условию, оставшиеся элементы добавляются в новый поток.
👍14🔥1
Класс Properties
В Java класс Properties представляет собой таблицу хэш-значений ключ-значение. Он является частью пакета
Некоторые методы класса
Пример файла Properties:
В Java класс Properties представляет собой таблицу хэш-значений ключ-значение. Он является частью пакета
java.util, и обычно используется для работы с конфигурационными файлами, настройками приложений и другими данными в формате ключ-значение.Некоторые методы класса
Properties:setProperty(String key, String value) - добавление или изменение значения ключа.getProperty(String key) - получение значения по ключу.load(InputStream in) - загрузка свойств из InputStream.store(OutputStream out, String comments) - сохранение свойств в OutputStream.defaults(Properties defaults) - устанавливает значения по умолчанию, которые будут использоваться при поиске значения для ключа, если оно не найдено в текущих свойствах.Пример файла Properties:
version=1.0
name=TestApp
👍9👏2
Цепочка методов (Method chaining) — это общий синтаксис для нескольких вызовов методов в объектно-ориентированных языках программирования. Каждый метод возвращает объект, что позволяет объединить вызовы в один оператор без необходимости использования переменных для хранения промежуточных результатов.
Пример для String:
Для того чтобы сделать такую штуку в своем классе, нужно что бы каждый метод возвращал из метода ссылку на текущий объект (this).
Пример для String:
text = text
.trim()
.replace("?", "")
.replace(" ", "-")
.toLowerCase();
Для того чтобы сделать такую штуку в своем классе, нужно что бы каждый метод возвращал из метода ссылку на текущий объект (this).
👍26🔥1😁1
Ромб
Интересная задача для тренеровки мозга. Нужно в ASCII-графике (скажем так) вывести ромб заданной размерности.
Не смотрите сразу решение, попытайтесь решить сами. Код вашего решения пишите в комментах, интересно как еще можно это сделать.
Алгоритм:поместим центр координат в центр ромба, в результате для каждой из 4х плоскостей мы увидим закономерность: там где сумма x и y (без знака) меньше или равна половине размерности ромба, там стоит *, иначе пробел.
Интересная задача для тренеровки мозга. Нужно в ASCII-графике (скажем так) вывести ромб заданной размерности.
Не смотрите сразу решение, попытайтесь решить сами. Код вашего решения пишите в комментах, интересно как еще можно это сделать.
*
***
*****
*******
*****
***
*
Алгоритм:
👍8
HttpClient представляет собой класс, введенный в Java 11, который предоставляет более современный и гибкий способ для выполнения HTTP-запросов и обработки HTTP-ответов. Он заменяет устаревший
HttpClient также поддерживает асинхронные операции, позволяя выполнять запросы асинхронно с использованием
HttpURLConnection и предоставляет более удобный интерфейс для работы с сетевыми операциями.HttpClient также поддерживает асинхронные операции, позволяя выполнять запросы асинхронно с использованием
CompletableFuture.👍12🔥2
Контракт метода hashCode
Для реализации хэш-функции в спецификации языка определены следующие правила:
1️⃣ вызов метода
2️⃣ вызов метода
3️⃣ вызов метода
Для реализации хэш-функции в спецификации языка определены следующие правила:
1️⃣ вызов метода
hashCode один и более раз над одним и тем же объектом должен возвращать одно и то же хэш-значение, при условии что поля объекта, участвующие в вычислении значения, не изменялись.2️⃣ вызов метода
hashCode над двумя объектами должен всегда возвращать одно и то же число, если эти объекты равны (вызов метода equals для этих объектов возвращает true).3️⃣ вызов метода
hashCode над двумя неравными между собой объектами должен возвращать разные хэш-значения. Хотя это требование и не является обязательным, следует учитывать, что его выполнение положительно повлияет на производительность работы хэш-таблиц.👍12🔥3👎1
class Cat {
public static void mew() {
System.out.println("Meow");
}
}
class SimonsCat extends Cat {
public static void mew() { }
}
public class Mew {
public static void main(String[] args) {
Cat cat = new Cat();
Cat simonsCat = new SimonsCat();
cat.mew();
simonsCat.mew();
}
}👍6👏2
Retrofit - это библиотека для работы с HTTP-запросами в Java и Android, разработанная компанией Square. Основной целью Retrofit является упрощение выполнения сетевых запросов и преобразование HTTP-ответов в объекты Java. Retrofit использует аннотации Java для определения типа запроса, параметров, URL и других свойств.
Retrofit предоставляет удобный способ выполнения асинхронных запросов. Вы можете использовать
Retrofit поддерживает использование интерсепторов для манипуляции запросами и ответами. Это может быть полезно для добавления заголовков, логирования и других операций.
Библиотека Retrofit предоставляет удобные средства для работы с сетевыми запросами, уменьшая объем необходимого кода и обеспечивая чистый и читаемый интерфейс для взаимодействия с удаленными API.
Retrofit предоставляет удобный способ выполнения асинхронных запросов. Вы можете использовать
Call как для выполнения синхронного вызова (call.execute()), так и для выполнения запросов асинхронно (call.enqueue(...)).Retrofit поддерживает использование интерсепторов для манипуляции запросами и ответами. Это может быть полезно для добавления заголовков, логирования и других операций.
Библиотека Retrofit предоставляет удобные средства для работы с сетевыми запросами, уменьшая объем необходимого кода и обеспечивая чистый и читаемый интерфейс для взаимодействия с удаленными API.
👍11👏3❤1
Несколько способов для избежания NullPointerException:
👉 Используйте
👉 При сравнении константы с переменной пришедшей из вне, нужно вызывать
👉 А при сравнении двух переменных используйте
👉 Используйте библиотеки с null-безопасностью, например, Apache Commons StringUtils.
👉 Вызывайте методы
👉 Применяйте
👉 Воспользуйтесь аннотациями
👉 При возврате из метода коллекций, не стоит возвращать
👉 Используйте
Optional из пакета java.util.👉 При сравнении константы с переменной пришедшей из вне, нужно вызывать
equals() на константе.👉 А при сравнении двух переменных используйте
java.util.Objects#equals.👉 Используйте библиотеки с null-безопасностью, например, Apache Commons StringUtils.
👉 Вызывайте методы
equals() и equalsIgnoreCase() на известных объектах.👉 Применяйте
valueOf() вместо toString().👉 Воспользуйтесь аннотациями
@NotNull и @Nullable на основе IDE.👉 При возврате из метода коллекций, не стоит возвращать
null, лучше пустую коллекцию (java.util.Collections#emptyList).🔥24👍11
Метод retainAll()
Метод
Параметры:
c –
Возврат:
true
Метод
retainAll() интерфейса Collection, удаляет из коллекции все элементы, не содержащиеся в переданной коллекции. По сути оставляет в коллекции только пересекающиеся элементы из двух коллекций.
boolean retainAll(Collection<?> c);
Параметры:
c –
коллекция, содержащая элементы, которые следует сохранить в коллекции.Возврат:
true
, если коллекция изменилась в результате вызова👍22🏆1
BIRT (Business Intelligence and Reporting Tools) - это открытая платформа, предоставляющая возможности для создания отчетов и бизнес-аналитики в приложениях, разрабатываемых на языке программирования Java. Эта платформа предоставляет инструменты для создания, развертывания и поддержки отчетов различной сложности.
Вот несколько ключевых аспектов BIRT:
Дизайнер отчетов (BIRT Designer)
BIRT предоставляет визуальный дизайнер отчетов, который позволяет разработчикам создавать отчеты с использованием различных элементов, таких как таблицы, графики, текстовые блоки и т.д. Этот дизайнер встроен в Eclipse IDE, что упрощает интеграцию с существующими проектами Java.
Интеграция с Java-приложениями
BIRT обеспечивает простую интеграцию с Java-приложениями. Вы можете использовать BIRT Runtime API для встраивания отчетов в свои приложения. Это позволяет вам создавать динамические отчеты, которые могут быть сгенерированы на лету в ответ на запросы пользователей.
Поддержка различных источников данных
BIRT может работать с различными источниками данных, такими как базы данных (SQL, JDBC), веб-службы, XML-файлы и другие. Это обеспечивает гибкость при работе с данными из различных источников.
Мощные возможности форматирования
BIRT предоставляет обширные возможности по форматированию отчетов. Вы можете настраивать внешний вид отчетов, включая шрифты, цвета, стили линий, и т.д.
Генерация различных форматов отчетов
BIRT поддерживает генерацию отчетов в различных форматах, таких как HTML, PDF, Excel, Word и другие. Это позволяет пользователям получать отчеты в удобных для них форматах.
Система расширений
BIRT предоставляет механизм для создания пользовательских расширений, что позволяет разработчикам расширять функциональность платформы в соответствии с конкретными требованиями проекта.
Открытый исходный код
BIRT является проектом с открытым исходным кодом, что обеспечивает доступность и гибкость для разработчиков. Это также означает наличие сообщества, которое может предоставить поддержку и ресурсы для пользователей BIRT.
Для начала работы с BIRT, вы можете загрузить Eclipse IDE, которая включает в себя BIRT Designer. После установки вы сможете создавать, редактировать и интегрировать отчеты BIRT в ваши Java-приложения.
Вот несколько ключевых аспектов BIRT:
Дизайнер отчетов (BIRT Designer)
BIRT предоставляет визуальный дизайнер отчетов, который позволяет разработчикам создавать отчеты с использованием различных элементов, таких как таблицы, графики, текстовые блоки и т.д. Этот дизайнер встроен в Eclipse IDE, что упрощает интеграцию с существующими проектами Java.
Интеграция с Java-приложениями
BIRT обеспечивает простую интеграцию с Java-приложениями. Вы можете использовать BIRT Runtime API для встраивания отчетов в свои приложения. Это позволяет вам создавать динамические отчеты, которые могут быть сгенерированы на лету в ответ на запросы пользователей.
Поддержка различных источников данных
BIRT может работать с различными источниками данных, такими как базы данных (SQL, JDBC), веб-службы, XML-файлы и другие. Это обеспечивает гибкость при работе с данными из различных источников.
Мощные возможности форматирования
BIRT предоставляет обширные возможности по форматированию отчетов. Вы можете настраивать внешний вид отчетов, включая шрифты, цвета, стили линий, и т.д.
Генерация различных форматов отчетов
BIRT поддерживает генерацию отчетов в различных форматах, таких как HTML, PDF, Excel, Word и другие. Это позволяет пользователям получать отчеты в удобных для них форматах.
Система расширений
BIRT предоставляет механизм для создания пользовательских расширений, что позволяет разработчикам расширять функциональность платформы в соответствии с конкретными требованиями проекта.
Открытый исходный код
BIRT является проектом с открытым исходным кодом, что обеспечивает доступность и гибкость для разработчиков. Это также означает наличие сообщества, которое может предоставить поддержку и ресурсы для пользователей BIRT.
Для начала работы с BIRT, вы можете загрузить Eclipse IDE, которая включает в себя BIRT Designer. После установки вы сможете создавать, редактировать и интегрировать отчеты BIRT в ваши Java-приложения.
👍7🔥1🏆1