uz
Feedback
Секреты Java

Секреты Java

Kanalga Telegram’da o‘tish

Обсуждаем Java, архитектуру, фреймворки и всё, о чем должны говорить разработчики. Владелец: @Alexey_Morl Реклама на бирже: https://telega.in/c/java_secrets

Ko'proq ko'rsatish
7 991
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
Ma'lumot yo'q30 kunlar
Postlar arxiv
#test
#test

Java Джуниоры! Важное объявление FAANG School в течение 24 часов отдают бесплатно свою библиотеку знаний. Вы можете получить
Java Джуниоры! Важное объявление FAANG School в течение 24 часов отдают бесплатно свою библиотеку знаний. Вы можете получить доступ: – Подробный гайд, как найти работу в IT без опыта – Подборка платформ с вакансиями для java-разработчиков – Пошаговая RoadMap по Java – Мануал по Docker. Основные команды и концепции – Микросервисы. Вопросы с собеседований – Шпаргалка с горячими клавишами JetBrains IDE. Ускоришь работу в 10 раз – Desk setup. Подборка аксессуаров для комфортной работы Библиотека знаний постоянно пополняется, но бесплатный доступ длится всего сутки. Чтобы получить полезные материалы, переходи по ссылке и жми на оранжевую кнопку.

✅ Pattern Matching для switch В рамках JEP 406 были представлен Pattern Matching для switch case. Ранее я уже писал про этот
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 #java21

✅ Что такое Optional и как его применять? Как часто вы ловили NullPointerException? Есть элегантное решение, как уменьшить ко
✅ Что такое 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 #optional

❓Что выведет код на изображении выше?
Anonymous voting

#test
#test

✅ Популярная задача на собеседовании в Yandex Уровень hard на LeetCode, однако решение крайне простое
✅ Популярная задача на собеседовании в Yandex Уровень hard на LeetCode, однако решение крайне простое

✅ Аннотация Spring @Primary В продолжение разговора о способах выбора нужного бина для инжекта, хочу вам рассказать про аннот
Аннотация 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 #primary

👩‍💻 Программирование теперь в телеграм! Вот обширная база материалов, которая ежедневно обновляется, выбирай своё направлен
👩‍💻 Программирование теперь в телеграм! Вот обширная база материалов, которая ежедневно обновляется, выбирай своё направление: Обучение Java с нуля Обучение Python с нуля Обучение JavaScript с нуля Обучение HTML/CSS с нуля Обучение C/С++ с нуля Обучение С# с нуля Обучение SQL/GO/PHP с нуля Обучение Kotlin/Swift с нуля Архив на 1789ГБ: Курсы, книги, шпаргалки, статьи, видео ресурсы — всё собрано в одном месте: @roadmap_ready

✅ Аннотация Spring @Primary В продолжение разговора о способах выбора нужного бина для инжекта, хочу вам рассказать про аннот
Аннотация 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 #primary

❓Что выведет код на изображении выше?
Anonymous voting

#test
#test

Мечтаешь о карьере в бигтехе? Приходи на интенсив в Открытые школы Т1 для java-разработчиков с опытом от года. Лучшие выпускн
Мечтаешь о карьере в бигтехе? Приходи на интенсив в Открытые школы Т1 для java-разработчиков с опытом от года. Лучшие выпускники получат оффер от Т1 — крупнейшей ИТ-компании по версии RAEX 2023🔝 и уникальный карьерный фаст-трек до мидла в бигтехе. В портфеле Холдинга Т1 800+ масштабных проектов и 70+ продуктов и услуг. 🧠 Всего за полгода мы выпустили 500+ специалистов. Участники присоединились к командам финтех-разработки и разработки ИТ-продуктов. Выпускников также ждут в юнитах облачных сервисов, развития ИИ-решений, интеграции и консалтинга. Программа курса: spring framework; docker; синхронное и асинхронное взаимодействие, брокеры сообщений; паттерны, SOLID. ⌛️ Быстрое обучение: 1 месяц. 💻Гибкий формат: все этапы онлайн, занятия по вечерам. Готов прокачаться вместе с экспертами индустрии? Тогда подавай заявку до 24 июля! Старт интенсива — 29 июля. Реклама. ООО "Т1". ИНН 7720484492.

✅ Аннотация Spring @Qualifier Spring нам дает удобный инструмент для инжекта зависимостей - аннотация @Autowired. По умолчани
Аннотация 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 #qualifier

✅ Для чего используется аннотация Deprecated? Deprecated является аннотацией, которая указывает, что использование определенн
Для чего используется аннотация 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 #deprecated

🔥Тесты для подготовки к собеседованию🔥 Выбери своё направление: 1. Frontend 2. Python 3. Java 4. Тестировщик QA 5. Data Sci
🔥Тесты для подготовки к собеседованию🔥 Выбери своё направление: 1. Frontend 2. Python 3. Java 4. Тестировщик QA 5. Data Science 6. DevOps 7. C# 8. С/C++ 9. Golang 10. PHP 11. Kotlin 12. Swift

❓Что выведет код на изображении выше?
Anonymous voting

#test
#test

Кошка говорит «мяу», собака говорит «гав», Java-разработчик говорит «кто-нибудь видел мой энергетик? А то мне еще баги исправ
Кошка говорит «мяу», собака говорит «гав», Java-разработчик говорит «кто-нибудь видел мой энергетик? А то мне еще баги исправлять». Да, быть разработчиком на Java непросто. Но нет ничего невозможного, если у вас есть желание разобраться и двухнедельный подготовительный курс от Хекслета за 990 рублей. ⏰ Начинаем уже 9 июля! – 62 онлайн-урока; – 4 живых вебинара; – практика с первого дня; – помощь наставника в закрытом чате. Нет опыта? Не беда! Как говорят в IT-среде: «А что, если попробовать так?» И мы тоже говорим вам “Попробуйте”!

✅ Shadowing или затенение Затенение (shadowing) переменных происходит, когда переменная с локальной областью видимости "перек
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