Java Гениев
87 subscribers
204 photos
77 videos
180 links
Download Telegram
Media is too big
VIEW IN TELEGRAM
Работа с регулярными выражениями на Java

👉
Как ограничить upcasting типа-параметра?

Задача: запретить этому методу принимать параметры разных типов:
<T> void pair(T a, T b) {}

То есть, нужно разрешить вызывать pair(Foo, Foo), но запретить pair(Foo, Bar).

Upcasting – приведение к типу-родителю. String → Object, Integer → Number.

Дело в том, что у любых двух классов есть общий предок: как минимум Object. Если вызвать этот метод с параметрами String и Boolean – согласно правилам вычисления типа-границы, параметр T будет стерт в Object.

Использовать super тоже не поможет: для этого нужно знать заранее, какой именно тип будет передаваться.

Фокус в том, что на этапе компиляции это невозможно. Объект любого типа всегда является объектом типа-родителя (отношение is a). Это фундаментальное правило ООП, которое невозможно нарушить. К тому же, подобный метод нарушал бы принцип подстановки Лисков.

Единственная возможность добиться желаемого поведения – с помощью getClass() сравнивать классы объектов в рантайме.


👉
This media is not supported in your browser
VIEW IN TELEGRAM
GitHub Copilot Chat доступен в JetBrains IDE!

Это огромный прирост производительности для Java-разработчиков, который поможет вам оставаться в потоке во время работы над кодом, исправления ошибок, написания тестов или использования нового API!

https://github.blog/changelog/2024-03-07-github-copilot-chat-general-availability-in-jetbrains-ide/

👉
Реально ли с нуля создать приложение без опыта в программировании?
Да! 🤩

На бесплатном курсе Нетологии «Основы разработки на Java» вы за 4 занятия познакомитесь с основами синтаксиса Java, одного из самых популярных языков программирования, и напишете на нём свой первый код.
Вас ждёт много практики:

☑️настроите Java и создадите консольное приложение для загрузки фото с сайта NASA;

☑️интегрируете это приложение в Telegram-бота;

☑️запустите приложение в облаке и создадите хранилище данных.

Курс стартует 14 марта. Регистрируйтесь, чтобы получить представление об устройстве Java и понять, подходит ли вам профессия разработчика

Реклама. ООО "Нетология". Erid LatgBjiNQ
Ресурс для изучения Spring

Мы хотим, чтобы этот репозиторий стал ресурсом, где люди смогут найти лучшие ресурсы для изучения Spring. Мы ищем лучшие книги, курсы, видео и всё остальное, что вы нашли полезным в изучении Spring.

https://github.com/spring-office-hours/resources-learning-spring

👉
Android Studio 4.2 Development Essentials
Neil Smyth (2021)

Beginning with the basics, this book provides an outline of the steps necessary to set up an Android development and testing environment. An overview of Android Studio is included covering areas such as tool windows, the code editor and the Layout Editor tool. An introduction to the architecture of Android is followed by an in-depth look at the design of Android applications and user interfaces using the Android Studio environment.

Скачать

👉
Можно ли удалять части API?

Иногда этот вопрос можно встретить в форме задачи. Когда библиотека попадает в пользование широкого круга разработчиков, на её разработку фактически накладывается ограничение обратной совместимости. То есть, если в следующей версии вдруг пропадут используемые классы и их члены, разработчики не захотят обновляться. Тогда развитие библиотеки остановится.

Это масштабная и сложная проблема. В её решении помогает в первую очередь семантическое версионирование и механизм прекращения поддержки (deprecation).

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

Ранее мы уже писали об особенностях использования . Собираясь удалить компонент API, нужно прежде отметить его (forRemoval=true).

Обычно разработчики библиотеки дают пользователю запас времени на миграцию. Они предоставляют Deprecation policy – документ, в котором дают обещание, сколько времени (или версий) после появления компонент всё еще не будет удален.

Для поиска в коде использования deprecated компонентов комплект JDK содержит утилиту jdeprscan. Утилита javadoc собирает список устаревших компонентов в отдельную страницу deprecated-list.html.

👉
👩‍💻 Как собрать дамп памяти в Eclipse Memory Analyzer и провести экспресс анализ OutOfMememory — практический урок для разработчиков и тестировщиков на Java

🎙Спикер Александр Царев — Tech Lead в Сбере и кандидат технических наук.

На вебинаре вы:

- узнаете, что такое дамп памяти, как его собрать и какие инструменты существуют для этих целей;
- познакомитесь с инструментом Eclipse Memory Analyzer, с помощью которого можно исследовать дампы памяти;
- получите ответы на все свои вопросы.

📢📢 Занятие пройдёт 19 марта в 20:00 мск и будет приурочено к старту курса «Java Developer. Advanced». Доступна рассрочка на обучение!

➡️ Пройдите короткий тест прямо сейчас, чтобы занять место на открытом уроке и получить запись: https://vk.cc/cvq70h

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Всё ещё используете If/else валидацию в Spring 6.0+ / SpringBoot 3.0+?

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

Чтобы избежать влияния несанкционированных параметров на ваш бизнес, в ваших веб-сервисах должна быть реализована проверка параметров на уровне контроллера! В большинстве случаев параметры запроса можно разделить на два следующих вида:

POST и PUT-запросы, использующие requestBody для передачи параметров.

GET-запросы, использующие requestParam/PathVariable для передачи параметров.

https://habr.com/ru/companies/otus/articles/799987/

original https://medium.com/javarevisited/still-use-if-else-perform-validation-in-spring-6-0-springboot-3-0-4e5e0936dec4

👉
Какая разница между @⁠Controller и @⁠RestController?

Controller – это один из стереотипов Spring Framework. Компоненты такого типа обычно занимаются обработкой сетевых запросов. Контроллер состоит из набора методов-обработчиков, помеченных аннотацией .

Ответ на запрос можно сформировать разными способами: например просто вернуть из обработчика строку с именем jsp-файла, или же вернуть ResponseBodyEmitter, который будет асинхронно заполняться данными позже. Все возможные варианты перечислены в документации.

Большинство современных API реализуется по архитектуре REST. В ней каждая сущность доступна под собственным URI. В методе-обработчике возвращается экземпляр класса этой сущности, который преобразуется в ответ сервера одним из HttpMessageConverter-ов. Например, в JSON его превратит MappingJackson2HttpMessageConverter. Чтобы использовать этот способ ответа, метод, или весь контроллер, должен иметь аннотацию .

– это просто сокращенная запись для + .

👉
Какие есть преимущества у массива перед коллекцией?

Для хранения ссылочных типов массив подходит хуже чем ArrayList. В основе реализации коллекции лежит такой же массив, поэтому эффективность будет той же самой. Однако, вам придется самостоятельно реализовывать логику управления хранилищем: например, увеличение массива при переполнении. А значит, будет больше шансов на ошибку.

Если использовать массивы вместо коллекций для примитивов, можно получить выигрыш по эффективности. Коллекции – generic-типы, из-за этого простые значения хранятся в них в форме ссылочных типов-оберток.

1. Autoboxing выделяет память под новый объект, это дорогая операция;
2. Кроме данных, Object занимает дополнительную память под метаинформацию;
3. Ячейки массива лежат близко в оперативной памяти, это увеличивает шансы попадания в кэш процессора.

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

Когда сэкономить всё-таки хочется, стоит выбрать одну из множества готовых библиотек не-generic реализаций коллекций. Списки примитивов можно найти в Eclipse Collections. В Android есть HashMap с целочисленными ключами – SparseArray.

👉
Когда используют Aware интерфейсы в Spring?

В Spring Framework существует большое количество «глобальных» (в рамках какого-либо скоупа) сущностей-синглтонов, которые не являются бинами. Естественно, все сразу они не нужны ни одному бину, обычный механизм внедрения для них не работает. Но тем не менее, должен существовать способ воспользоваться их функциональностью.

Маркерный интерфейс Aware служит родителем большому количеству интерфейсов с именами *Aware. Каждый из них, при реализации, доставляет бину какую-то специфичную для себя сущность. Так, например, компонент, которому нужно обратиться к контексту приложения, должен реализовывать ApplicationContextAware.

Технически, сами интерфейсы ничего не делают. Интерфейс FooAware обычно объявляет единственный метод void setFoo(Foo value). Через этот метод связанный с интерфейсом BeanPostProcessor передаст в бин нужную сущность.

Если бин реализует ServletContextAware, то в процессе инициализации бина к нему придет ServletContextAwareProcessor, и вызовет setServletContext с контекстом сервлета в качестве параметра.

👉
Media is too big
VIEW IN TELEGRAM
Хранилище файлов. Java + WebDav

Java + WebDav - загружаем файл на webdav через Rest запрос.

00:00 Приветствие
00:34 Spring Init
00:55 Docker Hub
01:54 docker-compose
04:25 webdav.conf
06:00 application.yaml
06:50 Sardine
07:36 WebDavConfig
09:15 WebConfig
11:40 FileService
14:09 Controller
17:22 Docker Fix
17:47 Postman
18:16 что не так?
20:46 Подписывайтесь

источник

👉
Java Collections

👉
⁉️ Как стать востребованным разработчиком на Java в 2024?

Освойте JVM и облачную инфраструктуру на онлайн-курсе «Java Developer. Advanced» от OTUS.

После обучения вы сможете:

- реализовать проект с несколькими сервисами, развёрнутыми в Kubernetes с демонстрацией модели метрик на дашборде Grafana;
- подать нагрузку на приложение, снять дамп памяти и описать его содержимое;
- запустить профилирование приложения под нагрузкой.

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

Стартуем уже 28 марта!

👉 Узнайте подробности и пройдите короткий тест прямо сейчас, это последний шанс попасть в группу: https://vk.cc/cvBhjj

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
В чем разница между Iterator и ListIterator?

— Iterator может итерироваться только вперед, а ListIterator может и вперед и назад.

— ListIterator имеет дополнительные методы previous(), hasPrevious(), add(), set().

— ListIterator позволяет получить индекс текущего элемента.

— ListIterator может начать итерацию с произвольного индекса списка, а Iterator только с начала.

— ListIterator можно получить только из объектов, реализующих List, а Iterator из любой коллекции.

— ListIterator является более функциональным и позволяет вносить изменения в список во время итерации, Iterator — только читать.

— Итераторы безопасны для использования в многопоточных приложениях, а ListIterator — нет.

👉
Реализации Microkernel архитектуры с помощью Java OSGI

Я хотел бы поделиться опытом реализации микроядерной архитектуры (microkernel) на Java с помощью OSGI (Open Service Gateway Initiative). Этот подход является промежуточным вариантом между микро-сервисной и монолитной архитектурой. С одной стороны присутствует разделение между компонентами на уровне VM с другой - межкомпонентное взаимодействие происходит без участия сети, что ускоряет запросы.

https://habr.com/ru/articles/801785/

👉