Java с нуля до middle
153 subscribers
56 photos
14 links
Download Telegram
Задача с leetcode

Дан linked list, поменять каждые два соседних узла местами и вернуть заголовок.

Решение в комментах
😱2
SOLID про O
Open Closed Principle (Принцип открытости/закрытости)

Классы должны быть открыты к расширению, но закрыты для изменения.

Что это значит на практике?
Добавляя какую-то новую функциональность к классу, в лучшем случае мы должны создать новый класс, переопределить у него методы и добавить функциональность туда.
Исходя из этого изначально наши классы должны быть спроектированы так, что бы их можно было расширять.
👍2
SOLID про L
Liskov’s Substitution Principle (Принцип подстановки Барбары Лисков)

Расширяя класс, разработчик должен сохранять его функциональность.

Что это означает на практике?
Переопределяя методы родительского класса мы должны сохранять поведение класса, неверно переопределять метод и писать туда совершенно другую логику.
👍2🔥2
Что такое REST(REpresentational State Transfer) API?

Это архитектура которая описывается следующими ограничениями:

Единый интерфейс между клиентом и сервером
Сервер передает информацию в стандартном формате
Например мы получаем json, с которым можем как то взаимодействовать, если есть доступ к форматированию.

Отсутствие состояния
Все запросы изолированы друг от друга, необходимое состояние содержится в самом запросе.

Кеширование
Некоторые ответы кэшируются для ускорения работы сервиса.

Многоуровневая система
Подключение клиентов и серверов может происходить через посредников - это используется например для масштабирования.
👍1
SOLID про I
Interface Segregation Principle (Принцип разделения интерфейса).

Мы не должен реализовывать интерфейс, методы в котором нам не нужны.

Что это значит на практике?
Берем нужный нам интерфейс, но половина методов в нем нам не нужна, очень часто в коде просто пишут заглушки и забивают на это. Заглушки это просто возврат null или вообще ничего, если нет return.

Правильно взять этот интерфейс и разделить его, чтобы использовать только те методы, которые нам нужны в реализации.
Channel name was changed to «Java с нуля до middle»
Наследование vs композиции

В чем разница?
Когда мы наследуем мы используем все поля и методы другого класса и если нужно их переопределяем.

Когда мы используем композицию мы берем ту часть класса которая нам нужна.
Пример композиции на картинке, в классе Person нам нужно использовать из класса Job, только set и get.

Так же можно заметить, что класс Person не может быть наследником Job по контексту, т.к это две разные смысловые сущности.
👎1
Можно ли перегрузить static метод?
Anonymous Poll
61%
Да
29%
Нет
10%
Что такое перегрузить?
Перегрузить статик методы можно, выглядит это так.
Какие модификаторы доступа можно применить к только что созданному классу?
Anonymous Poll
38%
private
76%
public
36%
protected
67%
default
При создании класса, ему можно объявлять следующие модификаторы доступа: public и default
Задача по sql

Найдите производителей, которые производили бы как ПК
со скоростью не менее 750 МГц, так и ПК-блокноты со скоростью не менее 750 МГц.
Вывести: Maker

Решение в комментах
Sql от chatgpt

Сгенерировал селект, по запросу: самый сложный запрос к бд, который ты можешь сделать.

Если расшифровал что делает селект, пиши в комменты.

Следующий уровень: сделайте explain analyse и найдите в нем не оптимальные места и как его можно улучшить
Фабрика бинов

Для создания фабрики 🏭бинов в Spring можно использовать конфигурационный класс с аннотацией @Configuration. В нем необходимо определить методы, которые будут создавать бины с помощью аннотации @Bean.

В данном случае конфигурационный класс BeanFactory содержит два метода-определения бинов: exampleService и dependency. Каждый из них создает экземпляр соответствующего класса и возвращает его.

После этого можно использовать бины в приложении с помощью аннотации @Autowired или через конструктор, что предпочтительнее внедряя 💉их через конструктор!
Динамическое прокси в Java
Cпособ создания прокси-объекта, который позволяет динамически реализовывать интерфейсы во время выполнения.

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

Пример тут:
https://javarush.com/groups/posts/2281-dinamicheskie-proksi
Жизненный цикл бина в контейнере

Когда контейнер запускается, он создает бин, инициализирует его и вызывает метод инициализации.
Затем контейнер использует бин для выполнения запросов и предоставления услуг.
Когда контейнер завершает работу, он вызывает метод завершения для бина, а затем уничтожает его.
Область видимости — scope.
Существует 2 области видимости по умолчанию

Singleton
Область видимости по умолчанию. В контейнере находится 1 экземпляр бина

Prototype
В контейнере может находится любое количество экземпляров бина

Есть еще четыре скопа в веб приложении, но об этом позже