Секреты Java
Kanalga Telegram’da o‘tish
Обсуждаем Java, архитектуру, фреймворки и всё, о чем должны говорить разработчики. Владелец: @Alexey_Morl Реклама на бирже: https://telega.in/c/java_secrets
Ko'proq ko'rsatish7 991
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
Ma'lumot yo'q30 kunlar
Postlar arxiv
7 991
Java Джуниоры! Важное объявление
FAANG School в течение 24 часов отдают бесплатно свою библиотеку знаний. Вы можете получить доступ:
– Подробный гайд, как найти работу в IT без опыта
– Подборка платформ с вакансиями для java-разработчиков
– Пошаговая RoadMap по Java
– Мануал по Docker. Основные команды и концепции
– Микросервисы. Вопросы с собеседований
– Шпаргалка с горячими клавишами JetBrains IDE. Ускоришь работу в 10 раз
– Desk setup. Подборка аксессуаров для комфортной работы
Библиотека знаний постоянно пополняется, но бесплатный доступ длится всего сутки. Чтобы получить полезные материалы, переходи по ссылке и жми на оранжевую кнопку.
7 991
✅ Pattern Matching для switch
В рамках JEP 406 были представлен Pattern Matching для switch case.
Ранее я уже писал про этот же механизм для instanceof.
В старых версиях java приходилось писать некрасивую цепочку if-else для определения типа переменной, что то вроде:
if (obj instanceof Integer) {
...
} else if (obj instanceof Double) {
...
} else if (obj instanceof String) {
...
}
Начинай с Java 21, эту структуру можно переписать очень элегантно и используя меньше кода:
switch (obj) {
case Integer i -> ...;
case Double d -> ...;
case String s-> ...;
default -> ...;
}
Так же Switch стал поддерживать уточнения базового условия:
switch (obj) {
case String s when s.length() > 0 -> ...;
...
}
Но при использовании такого подхода не стоит забывать про порядок доминирующих условий:
switch (obj) {
case String s -> ...;
case String s when s.length() > 0 -> ...;
...
}
Данный код выдаст ошибку на этапе компиляции. Так как порядок выбора подходящего case происходит сверху вниз, то условие 'case String s when s.length() > 0' никогда не будет применено из-за условия 'case String s', которое применимо ко всем String.
Вот правильная последовательность case:
switch (obj) {
case String s when s.length() > 0 -> ...;
case String s -> ...;
...
}
Так же switch научился работать с null:
switch (obj) {
case null -> ...;
...
}
До этого попадание объекта со значением null в switch вызывало NullPointerException.
Нововведения в switch делают его более мощным инструментом, который помогает значительно упростить код и сделать его более структурированным.
🫡 Секреты Java
#java #switch #java217 991
✅ Что такое Optional и как его применять?
Как часто вы ловили
NullPointerException?
Есть элегантное решение, как уменьшить количество таких ошибок. И это Optional.
Optional - это обертка над другими объектами, которые могут иметь значение или быть null. При использовании такого подхода вы сделаете свой код более безопасным и чистым.
Вот простой пример создания Optional:
var optionalStr = Optional.of("Hello, World!");
var emptyOptional = Optional.empty();
Optional содержит множество методов: isEmpty(), isPresent(), ifPresent(), map() и тд. Их нужно использовать с умом, чтобы код был лаконичным.
Вместо не очень элегантных проверок на null:
if(optionalStr.isPresent()) {
return someMethod(optionalStr.get());
} else {
return "str";
}
или делать какие-либо действия над значением ЕСЛИ оно присутствует:
return optionalStr.map(this::someMethod)
.orElse("str");
Зная нужные методы класса Optional, мы сделали код более коротким и красивым.
В этом примере .map() принимает ссылку на метод и возвращает результат выполнения этого метода, по сути, преобразуя значение. В случае если optionalString будет пустым, то .orElse() вернет значение, указанное в круглых скобках.
Используя Optional можно выстраивать цепочку операций в функциональном стиле:
optionalStr.map(String::toUpperCase)
.filter(s -> s.startsWith("H"))
.ifPresent(System.out::println);
Данный код преобразует строку в верхний регистр, проверит полученное значение на соответствие условию, и, если это условие будет истинно, то выведет строку в консоль.
Не бойтесь использовать Optional в своем коде, делайте его более устойчивым и читабельным.
🫡 Секреты Java
#java #optional7 991
✅ Популярная задача на собеседовании в Yandex
Уровень hard на LeetCode, однако решение крайне простое
7 991
✅ Аннотация Spring
@Primary
В продолжение разговора о способах выбора нужного бина для инжекта, хочу вам рассказать про аннотацию @Primary.
Эта аннотация, так же как и @Qualifier, помогает Spring выбрать подходящий бин. Если у вас в проекте есть несколько бинов одного типа, то с помощью @Primary вы можете указать бин, который будет использоваться по умолчанию.
Посмотрим на примере:
@Component
public class MyClass {
@Autowired
private MyInterface myBean;
//...
}
@Primary
@Component
public class MyBean1 implements MyInterface {
//...
}
@Component
public class MyBean2 implements MyInterface {
//...
}
Так как мы пометили бин MyBean1 с помощью аннотации @Primary, именно его и возьмет Spring для внедрения в MyClass.
Хочу заметить, что аннотацию @Primary можно использовать вместе с @Qualifier для более гибкой настройки инжекта бинов. Например, бины, которые должны использоваться по умолчанию, помечаем @Primary, а для специфических случаев используем @Qualifier.
@Component
public class MyClass {
@Autowired
@Qualifier("myBean2")
private MyInterface myBean;
//...
}
@Primary
@Component("myBean1")
public class MyBean1 implements MyInterface {
//...
}
@Component("myBean2")
public class MyBean2 implements MyInterface {
//...
}
В данном примере Spring возьмет для autowiring бин с именем myBean2, так как аннотация @Qualifier имеет приоритет перед @Primary.
🫡 Секреты Java
#java #spring #primary7 991
👩💻 Программирование теперь в телеграм!
Вот обширная база материалов, которая ежедневно обновляется, выбирай своё направление:
Обучение Java с нуля
Обучение Python с нуля
Обучение JavaScript с нуля
Обучение HTML/CSS с нуля
Обучение C/С++ с нуля
Обучение С# с нуля
Обучение SQL/GO/PHP с нуля
Обучение Kotlin/Swift с нуля
⛓ Архив на 1789ГБ: Курсы, книги, шпаргалки, статьи, видео ресурсы — всё собрано в одном месте: @roadmap_ready
7 991
✅ Аннотация Spring
@Primary
В продолжение разговора о способах выбора нужного бина для инжекта, хочу вам рассказать про аннотацию @Primary.
Эта аннотация, так же как и @Qualifier, помогает Spring выбрать подходящий бин. Если у вас в проекте есть несколько бинов одного типа, то с помощью @Primary вы можете указать бин, который будет использоваться по умолчанию.
Посмотрим на примере:
@Component
public class MyClass {
@Autowired
private MyInterface myBean;
//...
}
@Primary
@Component
public class MyBean1 implements MyInterface {
//...
}
@Component
public class MyBean2 implements MyInterface {
//...
}
Так как мы пометили бин MyBean1 с помощью аннотации @Primary, именно его и возьмет Spring для внедрения в MyClass.
Хочу заметить, что аннотацию @Primary можно использовать вместе с @Qualifier для более гибкой настройки инжекта бинов. Например, бины, которые должны использоваться по умолчанию, помечаем @Primary, а для специфических случаев используем @Qualifier.
@Component
public class MyClass {
@Autowired
@Qualifier("myBean2")
private MyInterface myBean;
//...
}
@Primary
@Component("myBean1")
public class MyBean1 implements MyInterface {
//...
}
@Component("myBean2")
public class MyBean2 implements MyInterface {
//...
}
В данном примере Spring возьмет для autowiring бин с именем myBean2, так как аннотация @Qualifier имеет приоритет перед @Primary.
🫡 Секреты Java
#java #spring #primary7 991
Мечтаешь о карьере в бигтехе?
Приходи на интенсив в Открытые школы Т1 для java-разработчиков с опытом от года. Лучшие выпускники получат оффер от Т1 — крупнейшей ИТ-компании по версии RAEX 2023🔝 и уникальный карьерный фаст-трек до мидла в бигтехе.
В портфеле Холдинга Т1 800+ масштабных проектов и 70+ продуктов и услуг.
🧠 Всего за полгода мы выпустили 500+ специалистов. Участники присоединились к командам финтех-разработки и разработки ИТ-продуктов. Выпускников также ждут в юнитах облачных сервисов, развития ИИ-решений, интеграции и консалтинга.
Программа курса: spring framework; docker; синхронное и асинхронное взаимодействие, брокеры сообщений; паттерны, SOLID.
⌛️ Быстрое обучение: 1 месяц.
💻Гибкий формат: все этапы онлайн, занятия по вечерам.
Готов прокачаться вместе с экспертами индустрии? Тогда подавай заявку до 24 июля!
Старт интенсива — 29 июля.
Реклама. ООО "Т1". ИНН 7720484492.
7 991
✅ Аннотация Spring
@Qualifier
Spring нам дает удобный инструмент для инжекта зависимостей - аннотация @Autowired. По умолчанию Spring ищет подходящий бин по типу и использует его.
Но бывают случаи когда у нас может быть несколько бинов одного типа. И в этом случае Spring не поймет какой бин нужно внедрить и он сообщит нам об этом исключением NoUniqueBeanDefinitionException.
Аннотация @Qualifier в Spring Framework используется для явного указания, какой именно бин должен быть использован. Это позволяет точно указать Spring контейнеру, какой бин необходимо внедрить.
Давайте к примеру, у нас есть классы:
@Component
public class MyClass {
@Autowired
private MyInterface myBean;
//...
}
@Component("myBean1")
public class MyBean1 implements MyInterface {
//...
}
@Component("myBean2")
public class MyBean2 implements MyInterface {
//...
}
В данном примере у нас есть два бина, реализующих интерфейс MyInterface. В этом случае Spring не поймет какой именно бин нужно заинжектить в MyClass и бросит ошибку NoUniqueBeanDefinitionException.
С помощью аннотации @Qualifier мы прямо указываем Spring контейнеру, какой бин мы заинжектить в MyClass. Если мы добавим аннотацию @Qualifier("myBean1") (в скобках мы указываем название бина) рядом с @Autowired, мы поможем спрингу:
@Component
public class MyClass {
@Autowired
@Qualifier("myBean1")
private MyInterface myBean;
//...
}
Добавив @Qualifier в месте с именем конкретного бина (у нас это myBean1) мы избежим двусмысленности.
Хочу отметить, что имя указываемое в @Qualifier - это имя, которое мы задали в аннотации @Component.
Так же мы могли бы использовать @Qualifier и при объявлении бина вместе с @Component, чтобы пометить класс как кандидата на autowiring, например:
@Component
@Qualifier("myBean1")
public class MyBean1 implements MyInterface {
//...
}
Правда указывать имя в @Component на мой взгляд проще.
Таким образом, аннотация @Qualifier позволяет точно указать Spring контейнеру, какой именно бин использовать в случае, когда есть несколько бинов одного типа. Это очень удобно при работе с большим количеством бинов и позволяет управлять процессом инъекции зависимостей более гибко и точно.
🫡 Секреты Java
#java #spring #qualifier7 991
✅ Для чего используется аннотация Deprecated?
Deprecated является аннотацией, которая указывает, что использование определенного метода или класса считается устаревшим и может быть удалено в будущих версиях. Когда элементы кода помечаются аннотацией
@Deprecated разработчики получают предупреждение об использовании API, которое устарело, изминилось и возможно будет удалено.
В Java 9 были добавлены новые атрибуты к аннотации @Deprecated: since и forRemoval, что сделало ее более информативной. Атрибут since используется для указания версии, в которой элемент стал устаревшим, в то время как атрибут forRemoval указывает, что элемент будет удален в будущей версии.
Первый пример, что мне попался - класс ClientHttpRequestFactories из spring-boot версии 3.2.3 и вложенный в него класс OkHttp:
@Deprecated(since = "3.2.0", forRemoval = true)
static class OkHttp {
//...
}
И мы можем понять - этот класс устарел с версии 3.2.0 и будет удален в будущей версии.
🫡 Секреты Java
#java #deprecated7 991
7 991
Кошка говорит «мяу», собака говорит «гав», Java-разработчик говорит «кто-нибудь видел мой энергетик? А то мне еще баги исправлять».
Да, быть разработчиком на Java непросто. Но нет ничего невозможного, если у вас есть желание разобраться и двухнедельный подготовительный курс от Хекслета за 990 рублей.
⏰ Начинаем уже 9 июля!
– 62 онлайн-урока;
– 4 живых вебинара;
– практика с первого дня;
– помощь наставника в закрытом чате.
Нет опыта? Не беда! Как говорят в IT-среде: «А что, если попробовать так?»
И мы тоже говорим вам “Попробуйте”!
7 991
✅ Shadowing или затенение
Затенение (shadowing) переменных происходит, когда переменная с локальной областью видимости "перекрывает" переменную с глобальной областью видимости с таким же именем.
На примере будет понятнее. Рассмотрим класс:
public class Shadowing {
private int x = 10; // переменная на уровне класса
public void printX() {
int x = 20; // локальная переменная
System.out.println(x);
System.out.println(this.x);
}
}
Вызов метода printX() которого выведет:
20
10
В примере хоть переменные и имеют одно имя, но они объявляются в разных областях видимости. Переменная "x" на уровне метода printX() перекрывает переменную "x" на уровне класса. А для доступа к переменной на уровне класса используется ключевое слово "this".
Локальные переменные, которые объявляются внутри метода, блока, конструктора будут перекрывать переменные объявленные на уровне объекта или класса.
А какой вывод будет тут после вызова метода printX() класса ShadowingInner , уверен, вы сами догадаетесь:
public class Shadowing {
private int x = 10;
class ShadowingInner {
private int x = 20;
public void printX() {
int x = 30;
System.out.println(x);
System.out.println(this.x);
System.out.println(Shadowing.this.x);
}
}
}
Затенение переменных может привести к определенной путанице и ошибкам в коде, поэтому рекомендуется избегать использования одинаковых имен переменных на разных уровнях.
🫡 Секреты Java
#java #shadowing