Как работает инъекция прототипа в синглтон?
Раньше мы уже рассматривали различия скоупов singleton и prototype в Spring Framework. Допустим ситуацию, когда в singleton-компонент внедряется зависимость со скоупом prototype – когда будет создан её объект?
Если просто добавить к определению бина аннотацию @Scope(SCOPE_PROTOTYPE), и использовать этот бин в синглтоне через аннотацию @Autowired – будет создан только один объект. Потому что синглтон создается только однажды, и обращение к прототипу случится тоже однажды при его создании (при внедрении зависимости).
Примитивный способ получать новый объект при каждом обращении – отказаться от @Autowired, и доставать его из контекста вручную. Для этого нужно вызывать context.getBean(MyPrototype.class).
Воспользоваться автоматическим внедрением зависимостей можно через внедрение метода (паттерн «Команда»). Автовайрится не сам объект, а производящий его метод.
Более красивый декларативный способ – правильно настроить определение бина. В аннотации @Scope кроме самого scopeName доступен второй параметр – proxyMode. По умолчанию его значение NO – прокси не создается. Но если указать INTERFACES или TARGET_CLASS, то под @Autowired будет внедряться не сам объект, а сгенерированный фреймворком прокси. И когда проксируемый бин имеет скоуп prototype, то объект внутри прокси будет пересоздаваться при каждом обращении.
Раньше мы уже рассматривали различия скоупов singleton и prototype в Spring Framework. Допустим ситуацию, когда в singleton-компонент внедряется зависимость со скоупом prototype – когда будет создан её объект?
Если просто добавить к определению бина аннотацию @Scope(SCOPE_PROTOTYPE), и использовать этот бин в синглтоне через аннотацию @Autowired – будет создан только один объект. Потому что синглтон создается только однажды, и обращение к прототипу случится тоже однажды при его создании (при внедрении зависимости).
Примитивный способ получать новый объект при каждом обращении – отказаться от @Autowired, и доставать его из контекста вручную. Для этого нужно вызывать context.getBean(MyPrototype.class).
Воспользоваться автоматическим внедрением зависимостей можно через внедрение метода (паттерн «Команда»). Автовайрится не сам объект, а производящий его метод.
Более красивый декларативный способ – правильно настроить определение бина. В аннотации @Scope кроме самого scopeName доступен второй параметр – proxyMode. По умолчанию его значение NO – прокси не создается. Но если указать INTERFACES или TARGET_CLASS, то под @Autowired будет внедряться не сам объект, а сгенерированный фреймворком прокси. И когда проксируемый бин имеет скоуп prototype, то объект внутри прокси будет пересоздаваться при каждом обращении.
👍15🔥2
Хотите освоить Scala? Начните с простого Web-сервиса на ZIO: zio-http + zio + quill
Приходите на бесплатный практический урок от OTUS. Спикер Алексей Воронец — руководитель разработки в «NAUMEN».
На примере построения простого веб-сервиса с REST API разберем основные компоненты (пути, бизнес логика, доступ к данным, документация) и посмотрим, как это можно реализовать в экосистеме ZIO.
Занятие пройдёт 22 апреля в 20:00 мск в рамках курса «Scala-разработчик». Доступна рассрочка на обучение!
Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок и получить запись: https://vk.cc/cwi4ET
Приходите на бесплатный практический урок от OTUS. Спикер Алексей Воронец — руководитель разработки в «NAUMEN».
На примере построения простого веб-сервиса с REST API разберем основные компоненты (пути, бизнес логика, доступ к данным, документация) и посмотрим, как это можно реализовать в экосистеме ZIO.
Занятие пройдёт 22 апреля в 20:00 мск в рамках курса «Scala-разработчик». Доступна рассрочка на обучение!
Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок и получить запись: https://vk.cc/cwi4ET
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍4❤2🔥2
Перечислите методы класса java.lang.Object
Этот вопрос используется, как способ начать разговор – по большинству методов можно уйти в обсуждении далеко вглубь. В первую очередь важно запомнить сигнатуры – не зная ответов на вопросы по этим методам, можно будет хотя бы рассуждать отталкиваясь от них. Также полезно открыть исходник и внимательно прочитать javadoc-документацию. Поступим как на интервью, и далее рассмотрим каждый из методов детально. Их список:
🔘
Этот вопрос используется, как способ начать разговор – по большинству методов можно уйти в обсуждении далеко вглубь. В первую очередь важно запомнить сигнатуры – не зная ответов на вопросы по этим методам, можно будет хотя бы рассуждать отталкиваясь от них. Также полезно открыть исходник и внимательно прочитать javadoc-документацию. Поступим как на интервью, и далее рассмотрим каждый из методов детально. Их список:
🔘
public final native Class<?> getClass()
🔘 public native int hashCode()
🔘 public boolean equals(Object obj)
🔘 protected native Object clone() throws CloneNotSupportedException
🔘 public String toString()
🔘 public final native void notify()
🔘 public final native void notifyAll()
🔘 public final native void wait(long timeout) throws InterruptedException
🔘 public final void wait(long timeout, int nanos) throws InterruptedException
🔘 public final void wait() throws InterruptedException
🔘 protected void finalize() throws Throwable
👍13🔥3❤1
✅ Что нужно знать для работы с Greenplum?
Разберем предпосылки, историю, особенности на бесплатном практическом уроке посвященному курсу «Базы данных» от OTUS.
🔹На вебинаре мы разберём архитектуру и отказоустойчивость кластера Greenplum. Рассмотрим резервное копирование Greenplum и рекомендации по оптимизации.
🔹На уроке вы получите рекомендации: по загрузке \ выгрузке; Update \ deletes в таблицах GP; Append-Optimized таблицы
👉 Регистрация
https://clck.ru/3AABc9?erid=LjN8KP99a
Разберем предпосылки, историю, особенности на бесплатном практическом уроке посвященному курсу «Базы данных» от OTUS.
🔹На вебинаре мы разберём архитектуру и отказоустойчивость кластера Greenplum. Рассмотрим резервное копирование Greenplum и рекомендации по оптимизации.
🔹На уроке вы получите рекомендации: по загрузке \ выгрузке; Update \ deletes в таблицах GP; Append-Optimized таблицы
👉 Регистрация
https://clck.ru/3AABc9?erid=LjN8KP99a
👍5❤2🔥2
toString
Строковое представление экземпляра. По умолчанию возвращает "ПолноеИмяКласса@хэшВ16тиричномВиде" (например "java.lang.Object@1a23b4f"). Часть после @ – не адрес в памяти, так что умолчательная реализация почти не несет практической пользы. Полезно добавлять нормальную реализацию даже если не необходимо в логике программы – поможет в отладке. Готовый вызов x.toString() с проверкой на null уже реализован в String.valueOf(x).
Строковое представление экземпляра. По умолчанию возвращает "ПолноеИмяКласса@хэшВ16тиричномВиде" (например "java.lang.Object@1a23b4f"). Часть после @ – не адрес в памяти, так что умолчательная реализация почти не несет практической пользы. Полезно добавлять нормальную реализацию даже если не необходимо в логике программы – поможет в отладке. Готовый вызов x.toString() с проверкой на null уже реализован в String.valueOf(x).
👍13🔥4
Присоединяйтесь к нашему бесплатному курсу и начните увлекательное путешествие в мир Java!
Изучайте основы, создавайте программы, разбирайтесь с методами и анализируйте ошибки в коде. Практика, упражнения и проверочные тесты помогут вам освоить навыки программирования.
🎓 Чему вы научитесь:
— Создавать программы с использованием основных конструкций языка.
— Разделять код на методы для повторного использования.
— Анализировать ошибки в коде с использованием отладочной печати.
💼 Включено в курс:
29 уроков (видео и/или текст), 35 упражнений в тренажере, 95 проверочных тестов + дополнительные материалы.
Вы с нами?😉
Изучайте основы, создавайте программы, разбирайтесь с методами и анализируйте ошибки в коде. Практика, упражнения и проверочные тесты помогут вам освоить навыки программирования.
🎓 Чему вы научитесь:
— Создавать программы с использованием основных конструкций языка.
— Разделять код на методы для повторного использования.
— Анализировать ошибки в коде с использованием отладочной печати.
💼 Включено в курс:
29 уроков (видео и/или текст), 35 упражнений в тренажере, 95 проверочных тестов + дополнительные материалы.
Вы с нами?😉
👍8🔥2
new String("Hello_42") == "Hello_" + 42?
Такие вопросы о сравнении строковых и числовых констант проверяют знания о понятии пулов литералов (literal pool). Не следует путать с пулом констант класса. Виртуальная машина переиспользует один и тот же объект для строкового литерала при загрузке класса, если такой уже выделен в куче. Вот почему "Hello" == "Hello" истинно, не смотря на то что String – ссылочный тип. Такая оптимизация возможна благодаря свойству неизменяемости (immutable) класса String, и называется интернирование строк.
Кроме самих литералов, интернирование применяется ко всем константным выражениям. К таким выражениям в этом примере относятся неявное приведение числа 42 к строке и конкатенация констант. Это делает истинным "Hello_42" == "Hello_" + 42.
Пул литералов не работает, когда явно используется оператор new. Это причина, по которой выражение new String("Hello_42") == "Hello_" + 42 ложно.
Такие вопросы о сравнении строковых и числовых констант проверяют знания о понятии пулов литералов (literal pool). Не следует путать с пулом констант класса. Виртуальная машина переиспользует один и тот же объект для строкового литерала при загрузке класса, если такой уже выделен в куче. Вот почему "Hello" == "Hello" истинно, не смотря на то что String – ссылочный тип. Такая оптимизация возможна благодаря свойству неизменяемости (immutable) класса String, и называется интернирование строк.
Кроме самих литералов, интернирование применяется ко всем константным выражениям. К таким выражениям в этом примере относятся неявное приведение числа 42 к строке и конкатенация констант. Это делает истинным "Hello_42" == "Hello_" + 42.
Пул литералов не работает, когда явно используется оператор new. Это причина, по которой выражение new String("Hello_42") == "Hello_" + 42 ложно.
👍25🔥4
Новосибирск, 25 апреля приглашаем на митап IT Talk by Sber для Java- и DevOps-разработчиков! 🤩
Мы собрали экспертов из разных команд и городов, чтобы рассказать о технологиях и инструментах, которые увеличивают эффективность работы разработчика и всей команды.
На митапе обсудим интересные темы:
👉 Советы для оптимизации сборки Java-проектов, практики CI и автоматизации сборки приложений.
👉 Что такое код с точки зрения законодательства, кому он принадлежит и какие есть права у автора кода?
👉 Инциденты в проме: что делать и не делать, чтобы устранить инцидент, и что на самом деле происходит, когда вы видите «Сервис недоступен, повторите операцию через 5 минут или позже»?
Встречаемся 25 апреля с 17:30 до 22:00 в лофте FoodFactory: Новосибирск, ул. Коммунистическая, 14.
Регистрируйтесь по ссылке!
Мы собрали экспертов из разных команд и городов, чтобы рассказать о технологиях и инструментах, которые увеличивают эффективность работы разработчика и всей команды.
На митапе обсудим интересные темы:
👉 Советы для оптимизации сборки Java-проектов, практики CI и автоматизации сборки приложений.
👉 Что такое код с точки зрения законодательства, кому он принадлежит и какие есть права у автора кода?
👉 Инциденты в проме: что делать и не делать, чтобы устранить инцидент, и что на самом деле происходит, когда вы видите «Сервис недоступен, повторите операцию через 5 минут или позже»?
Встречаемся 25 апреля с 17:30 до 22:00 в лофте FoodFactory: Новосибирск, ул. Коммунистическая, 14.
Регистрируйтесь по ссылке!
👍9🔥2
Какие бывают строковые классы?
Кроме очевидного класса String, в стандарте Java существует еще StringBuffer и StringBuilder. Класс String иммутабелен, а эти два вспомогательных класса реализуют для него паттерн Builder и служат способом редактирования строки без относительно дорогого пересоздания объекта.
Все методы StringBuffer синхронны. В Java 1.5 ему на замену пришел несинхронизированный вариант StringBuilder. Эта ситуация аналогична HashMap и Hashtable. В остальном эти два класса почти ничем не отличаются, имеют одинаковый набор методов и конструкторов.
Для буфера и билдера не работает синтаксический сахар строк:
🔘 Их нельзя создать литералом, вместо этого используется обычный конструктор;
🔘 Нельзя конкатенировать оператором +, вместо этого используются обычные методы insert и append.
Сам оператор конкатенации константных выражений, компилируется в интернированную строку, но для не-констант неявно использует StringBuilder.
Кроме очевидного класса String, в стандарте Java существует еще StringBuffer и StringBuilder. Класс String иммутабелен, а эти два вспомогательных класса реализуют для него паттерн Builder и служат способом редактирования строки без относительно дорогого пересоздания объекта.
Все методы StringBuffer синхронны. В Java 1.5 ему на замену пришел несинхронизированный вариант StringBuilder. Эта ситуация аналогична HashMap и Hashtable. В остальном эти два класса почти ничем не отличаются, имеют одинаковый набор методов и конструкторов.
Для буфера и билдера не работает синтаксический сахар строк:
🔘 Их нельзя создать литералом, вместо этого используется обычный конструктор;
🔘 Нельзя конкатенировать оператором +, вместо этого используются обычные методы insert и append.
Сам оператор конкатенации константных выражений, компилируется в интернированную строку, но для не-констант неявно использует StringBuilder.
👍15🔥1
⁉️ Как связаны Scala и Apache Kafka?
Если вы инженер данных или разработчик, который хочет эффективно работать с большими данными и микросервисной архитектурой, вам нужно это знать!
💻 Приходите на бесплатный практический урок «Введение в язык программирования Scala» от OTUS, где опытный эксперт разберет:
- общие принципы и функциональность Scala;
- средства разработки, использующиеся в Apache Kafka;
- языковые средства Scala 2 и 3;
- основы функционального программирования;
- взаимодействие с Kafka через Alpakka.
👉 Встречаемся 25 апреля в 20:00 мск в рамках курса «Apache Kafka».
🔥 Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок: https://vk.cc/cwmB45
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Если вы инженер данных или разработчик, который хочет эффективно работать с большими данными и микросервисной архитектурой, вам нужно это знать!
💻 Приходите на бесплатный практический урок «Введение в язык программирования Scala» от OTUS, где опытный эксперт разберет:
- общие принципы и функциональность Scala;
- средства разработки, использующиеся в Apache Kafka;
- языковые средства Scala 2 и 3;
- основы функционального программирования;
- взаимодействие с Kafka через Alpakka.
👉 Встречаемся 25 апреля в 20:00 мск в рамках курса «Apache Kafka».
🔥 Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок: https://vk.cc/cwmB45
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍4🔥2
Как обойти строчку?
Для хранения строк в Java в общем случае используется кодировка UTF-16. Для полного понимания вопроса необходимо понимать ее особенности: что такое суррогатные пары и плоскости юникода. Конкретнее, что один символ в обычном понимании слова называется code point, и представляется одним или двумя значениями типа char. Значит, корректный ответ нужно начать с уточнения: подразумевается ли обход значений char или code point.
Из этого следует, что и длина строки, верхняя граница итерации – тоже понятие неоднозначное. Метод length() на самом деле возвращает не количество Unicode-символов, а количество значений char. Реальную логическую длину (количество кодовых точек) покажет метод codePointCount(). Нужно помнить, что чтобы обнаружить суррогатные пары, внутри ему придется проитерировать по символам.
Итерироваться по char можно либо получая по одному символу с помощью метода charAt(), либо со всем массивом сразу, методом toCharArray(). В случае с массивом создается копия внутреннего значения – это естественно медленнее, зато этот массив-копию можно мутировать. Работать с суррогатными парами придется вручную, для этого в классе Character есть специальные методы.
Другой вариант – сразу оперировать методами codePointAt() и codePointBefore(). Параметром указываются индексы массива char, но результатом будут кодовые точки типа int.
В Java 8 появился новый удобный способ обхода – методы chars() и codePoints(). Они возвращают IntStream из символов и кодовых точек соответственно. Носителем результирующих стримов выступает оригинальное внутреннее значение строки, копирование массива не требуется.
Для хранения строк в Java в общем случае используется кодировка UTF-16. Для полного понимания вопроса необходимо понимать ее особенности: что такое суррогатные пары и плоскости юникода. Конкретнее, что один символ в обычном понимании слова называется code point, и представляется одним или двумя значениями типа char. Значит, корректный ответ нужно начать с уточнения: подразумевается ли обход значений char или code point.
Из этого следует, что и длина строки, верхняя граница итерации – тоже понятие неоднозначное. Метод length() на самом деле возвращает не количество Unicode-символов, а количество значений char. Реальную логическую длину (количество кодовых точек) покажет метод codePointCount(). Нужно помнить, что чтобы обнаружить суррогатные пары, внутри ему придется проитерировать по символам.
Итерироваться по char можно либо получая по одному символу с помощью метода charAt(), либо со всем массивом сразу, методом toCharArray(). В случае с массивом создается копия внутреннего значения – это естественно медленнее, зато этот массив-копию можно мутировать. Работать с суррогатными парами придется вручную, для этого в классе Character есть специальные методы.
Другой вариант – сразу оперировать методами codePointAt() и codePointBefore(). Параметром указываются индексы массива char, но результатом будут кодовые точки типа int.
В Java 8 появился новый удобный способ обхода – методы chars() и codePoints(). Они возвращают IntStream из символов и кодовых точек соответственно. Носителем результирующих стримов выступает оригинальное внутреннее значение строки, копирование массива не требуется.
👍20🔥4
❓Хотите прокачать скиллы в автоматизации тестирования на Java?
👉 Ждем вас на бесплатном практическом уроке «Модульное и интеграционное тестирование при помощи Spring Boot» от OTUS.
На вебинаре разберем:
- модульное тестировании при помощи Spring Boot;
- интеграционное тестирование при помощи Spring Boot;
- написание тестов на отдельные фрагменты SUT.
👉 Для участия зарегистрируйтесь https://otus.pw/k43m/?erid=LjN8K528h
⏰ Встречаемся 24 апреля в 20:00 мск в рамках курса «Java QA Engineer. Professional».
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
👉 Ждем вас на бесплатном практическом уроке «Модульное и интеграционное тестирование при помощи Spring Boot» от OTUS.
На вебинаре разберем:
- модульное тестировании при помощи Spring Boot;
- интеграционное тестирование при помощи Spring Boot;
- написание тестов на отдельные фрагменты SUT.
👉 Для участия зарегистрируйтесь https://otus.pw/k43m/?erid=LjN8K528h
⏰ Встречаемся 24 апреля в 20:00 мск в рамках курса «Java QA Engineer. Professional».
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
👍3❤2🔥2
Из чего состоит String?
Ответ как обычно зависит от версии Java. Два поля, которые присутствовали во всех версиях – массив символов char[] value и int hash. В поле hash кэшируется хэш-сумма при первом подсчете для соблюдения контракта метода hashCode.
До Java 7 были еще поля offset и count – чтобы переиспользовать без пересоздания массивы из билдеров и других строк. В современной джаве от этого отказались в угоду меньшего потребления памяти.
Изначально все строки хранились в кодировке UTF-16, каждый символ занимал по два байта и умещался в char. Однако выяснилось, что статистически большинство строк содержит только ASCII-символы, которые вмещаются в один байт и составляют кодировку LATIN-1. То есть старший байт в большинстве char остается нулевым, и строки наполовину состоят из пустоты. А примерно четверть памяти приложений состоит из одних только строк.
В Java 6 была введена экспериментальная фича Compressed Strings – способность строки хранить строки в LATIN-1 в массиве byte вместо char. С этой фичей был ряд проблем, и позднее ее убрали.
Снова сжатие строк появилось в Java 9 – теперь оно называется Compact Strings и включено по умолчанию. В классе String появилось поле coder, которое переключает кодировки, и статический флаг COMPACT_STRINGS, выключающий фичу вообще. Тип массива value окончательно изменился с char[] на byte[].
Ответ как обычно зависит от версии Java. Два поля, которые присутствовали во всех версиях – массив символов char[] value и int hash. В поле hash кэшируется хэш-сумма при первом подсчете для соблюдения контракта метода hashCode.
До Java 7 были еще поля offset и count – чтобы переиспользовать без пересоздания массивы из билдеров и других строк. В современной джаве от этого отказались в угоду меньшего потребления памяти.
Изначально все строки хранились в кодировке UTF-16, каждый символ занимал по два байта и умещался в char. Однако выяснилось, что статистически большинство строк содержит только ASCII-символы, которые вмещаются в один байт и составляют кодировку LATIN-1. То есть старший байт в большинстве char остается нулевым, и строки наполовину состоят из пустоты. А примерно четверть памяти приложений состоит из одних только строк.
В Java 6 была введена экспериментальная фича Compressed Strings – способность строки хранить строки в LATIN-1 в массиве byte вместо char. С этой фичей был ряд проблем, и позднее ее убрали.
Снова сжатие строк появилось в Java 9 – теперь оно называется Compact Strings и включено по умолчанию. В классе String появилось поле coder, которое переключает кодировки, и статический флаг COMPACT_STRINGS, выключающий фичу вообще. Тип массива value окончательно изменился с char[] на byte[].
❤12👍5🤔3❤🔥1⚡1
- Осваивай Spring!
Тест на знание языка Java
— Ответь на 21 вопрос и проверь, насколько хорошо ты знаешь язык Java и готов освоить Spring. Сможешь сдать — пройдёшь на продвинутый онлайн-курс "Разработчик на Spring" Framework со скидкой!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
Как применить регулярное выражение в Java?
Регулярные выражения – мощный механизм работы со строками. Здесь мы не будем говорить о регулярных выражениях в целом, поговорим об их использовании в Java. Это становится возможно благодаря пакету java.util.regex стандартной библиотеки.
Работа с регулярными выражениями в Java начинается с класса Pattern. Это представление самого выражения, без привязки к целевому тексту. Создать его можно компиляцией строки, с помощью фабричного метода Pattern.compile(). Паттерн иммутабельный и потокобезопасный.
Matcher – регулярное выражение, примененное к конкретному тексту. Пораждается вызовом метода Pattern.matches(). Одним паттерном можно порождать несколько разных матчеров. В отличие от паттерна, матчер мутирует. Он не безопасен для многопоточной среды. Основные операции регулярных выражений – перебор совпадений, доступ к группам, замена – реализованы именно в этом классе.
Работа с экземпляром Matcher похожа на работу с итератором. Результат метода matches() просто скажет, соответствует ли строка шаблону. Но после его вызова матчер поменяет состояние. Теперь, из него можно получить группы, позицию совпадения в тексте, а также произвести замену.
В объекте шаблона Pattern реализованы несколько методов-сокращений, чтобы не использовать Matcher явно. Например, просто проверить строку на соответствие выражению можно одним методом Pattern.matches().
Регулярные выражения – мощный механизм работы со строками. Здесь мы не будем говорить о регулярных выражениях в целом, поговорим об их использовании в Java. Это становится возможно благодаря пакету java.util.regex стандартной библиотеки.
Работа с регулярными выражениями в Java начинается с класса Pattern. Это представление самого выражения, без привязки к целевому тексту. Создать его можно компиляцией строки, с помощью фабричного метода Pattern.compile(). Паттерн иммутабельный и потокобезопасный.
Matcher – регулярное выражение, примененное к конкретному тексту. Пораждается вызовом метода Pattern.matches(). Одним паттерном можно порождать несколько разных матчеров. В отличие от паттерна, матчер мутирует. Он не безопасен для многопоточной среды. Основные операции регулярных выражений – перебор совпадений, доступ к группам, замена – реализованы именно в этом классе.
Работа с экземпляром Matcher похожа на работу с итератором. Результат метода matches() просто скажет, соответствует ли строка шаблону. Но после его вызова матчер поменяет состояние. Теперь, из него можно получить группы, позицию совпадения в тексте, а также произвести замену.
В объекте шаблона Pattern реализованы несколько методов-сокращений, чтобы не использовать Matcher явно. Например, просто проверить строку на соответствие выражению можно одним методом Pattern.matches().
👍12🔥1
erid: 2RanyoKCft4
CodeFest — это ежегодная тёплая ламповая айтишная конференция, на которую слетаются русскоговорящие айтишники с разных уголков страны, чтобы встретиться с коллегами, поделиться новостями и обсудить последние тенденции в мире разработки.
Ключевые направления программы: Backend, Frontend, Management, QA, Data Science, Mobile, Design, Web 3, System Аnalysis, а также дискуссионный народный поток Kvartirniki и вдохновляющие Keynote выступления от айти-звёзд.
Изюминка CodeFest — неформальное общение, которого много, которое невероятно дружелюбное, и зачином для которого служат те самые выступления в ключевых секциях. Начали с доклада в зале — закончили спонтанным митапом в холле.
Присоединяйтесь к невероятной атмосфере конференции:
■ 25-26 мая, Новосибирск, Экспоцентр.
■ 1800 участников на одной площадке.
■ Участие офлайн и онлайн.
■ Более 120 докладов.
■ Насыщенная программа от партнёров конференции.
Приезжайте командой, участвуйте лично.
Регистрация 👉 https://l.codefest.ru/javatasks
Реклама. АО "Тинькофф Банк", ИНН 7710140679, лицензия ЦБ РФ № 2673
CodeFest — это ежегодная тёплая ламповая айтишная конференция, на которую слетаются русскоговорящие айтишники с разных уголков страны, чтобы встретиться с коллегами, поделиться новостями и обсудить последние тенденции в мире разработки.
Ключевые направления программы: Backend, Frontend, Management, QA, Data Science, Mobile, Design, Web 3, System Аnalysis, а также дискуссионный народный поток Kvartirniki и вдохновляющие Keynote выступления от айти-звёзд.
Изюминка CodeFest — неформальное общение, которого много, которое невероятно дружелюбное, и зачином для которого служат те самые выступления в ключевых секциях. Начали с доклада в зале — закончили спонтанным митапом в холле.
Присоединяйтесь к невероятной атмосфере конференции:
■ 25-26 мая, Новосибирск, Экспоцентр.
■ 1800 участников на одной площадке.
■ Участие офлайн и онлайн.
■ Более 120 докладов.
■ Насыщенная программа от партнёров конференции.
Приезжайте командой, участвуйте лично.
Регистрация 👉 https://l.codefest.ru/javatasks
Реклама. АО "Тинькофф Банк", ИНН 7710140679, лицензия ЦБ РФ № 2673
👍5🔥2
Как разбить строку на слова?
StringTokenizer – специально предназначенный для этого класс стандартной библиотеки Java. Ему нужно задать разделители, по ним строка будет разделена на «токены». Это устаревший класс, он остается в библиотеке только для обратной совместимости.
Вместо него рекомендуется использовать метод String.split(). Метод принимает строку с регулярным выражением, и опциональный лимит токенов. Реализация особенно оптимизирована для односимвольного разделителя. Но следует помнить, что даже если символ один, это всё ещё регулярное выражение – спецсимвол должен экранироваться.
Другой подходящий метод – Pattern.split(). Он, наоборот, вызывается у регулярного выражения, а принимает целевую строку. В этот же метод делегируется и выполнение String.split(). Этот способ предпочтительнее, когда в регулярном выражении больше одного символа, а скомпилированный паттерн применяется повторно.
StringTokenizer – специально предназначенный для этого класс стандартной библиотеки Java. Ему нужно задать разделители, по ним строка будет разделена на «токены». Это устаревший класс, он остается в библиотеке только для обратной совместимости.
Вместо него рекомендуется использовать метод String.split(). Метод принимает строку с регулярным выражением, и опциональный лимит токенов. Реализация особенно оптимизирована для односимвольного разделителя. Но следует помнить, что даже если символ один, это всё ещё регулярное выражение – спецсимвол должен экранироваться.
Другой подходящий метод – Pattern.split(). Он, наоборот, вызывается у регулярного выражения, а принимает целевую строку. В этот же метод делегируется и выполнение String.split(). Этот способ предпочтительнее, когда в регулярном выражении больше одного символа, а скомпилированный паттерн применяется повторно.
👍16❤2🔥2
Перегрузка — очень мощная техника для случаев, когда нужно одинаковое имя метода с разными параметрами. Вместо того, чтобы дублировать имя метода и добавлять беспорядок в ваш код, вы можете просто перегрузить его. Это позволяет сохранять код чистым, а также снижает риск того, что дублирующие методы сломают часть системы.
Как это провернуть? Расскажет опытный эксперт на открытом практическом уроке от OTUS! Встречаемся 26 апреля в 20:00 мск в преддверии старта курса «Углубленное изучение языка Java».
Все участники вебинара получат специальную цену на обучение и персональную консультацию от менеджеров OTUS!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥1
Как прочитать InputStream в строку?
Обычно строковые данные извне попадают в программу именно в виде потока. Потоком читаются файлы, сетевые данные из сокета, пользовательский ввод. Если есть такая возможность, лучше избегать сохранения потоковых данных в память, и обрабатывать их также в потоке. Например, когда из большого xml-файла необходимо достать один определенный элемент, имеет смысл выбрать потоковый xml-парсер.
В общем виде все решения выглядят так. Заводится буфер – массив символов. Поток направляется в этот буфер. По заполнению данные из массива присоединяются в хвост строки-результата.
Простой способ – использовать трюк со сканером. Вообще класс Scanner читает из потока подстроки, разделенные указанным символом. Когда нужно прочитать всю строку сразу, в качестве разделителя устанавливается "\\A" – спецсимвол «начало строки». Это решение просто в реализации, но имеет проблемы. Размер внутреннего буфера фиксирован (1024 символа), а логика поиска разделителя плохо влияет на производительность.
Хорошее решение для продакшна – читать в собственный массив-буфер непосредственно методом InputStream.read, либо обернув поток в InputStreamReader. Данные из буфера затем переправляются в строку через StringBuilder или ByteArrayOutputStream. За готовой реализацией можно обратиться в библиотеки Apache Commons IO и Google Guava. Полный код реализации и сравнение производительности описаны на stackoverflow.
На интервью этот вопрос часто возникает как часть практической задачи, для консольного ввода-вывода. Поэтому, если вы идете на собеседование со своим компьютером, и неуверенно владеете классами работы с потоками, стоит заранее подготовить шпаргалку с кодом.
Обычно строковые данные извне попадают в программу именно в виде потока. Потоком читаются файлы, сетевые данные из сокета, пользовательский ввод. Если есть такая возможность, лучше избегать сохранения потоковых данных в память, и обрабатывать их также в потоке. Например, когда из большого xml-файла необходимо достать один определенный элемент, имеет смысл выбрать потоковый xml-парсер.
В общем виде все решения выглядят так. Заводится буфер – массив символов. Поток направляется в этот буфер. По заполнению данные из массива присоединяются в хвост строки-результата.
Простой способ – использовать трюк со сканером. Вообще класс Scanner читает из потока подстроки, разделенные указанным символом. Когда нужно прочитать всю строку сразу, в качестве разделителя устанавливается "\\A" – спецсимвол «начало строки». Это решение просто в реализации, но имеет проблемы. Размер внутреннего буфера фиксирован (1024 символа), а логика поиска разделителя плохо влияет на производительность.
Хорошее решение для продакшна – читать в собственный массив-буфер непосредственно методом InputStream.read, либо обернув поток в InputStreamReader. Данные из буфера затем переправляются в строку через StringBuilder или ByteArrayOutputStream. За готовой реализацией можно обратиться в библиотеки Apache Commons IO и Google Guava. Полный код реализации и сравнение производительности описаны на stackoverflow.
На интервью этот вопрос часто возникает как часть практической задачи, для консольного ввода-вывода. Поэтому, если вы идете на собеседование со своим компьютером, и неуверенно владеете классами работы с потоками, стоит заранее подготовить шпаргалку с кодом.
👍19🔥1
Сертификат по кибербезопасности на новом курсе для старших разработчиков Java
🚀 12 мая мы запускаем юбилейный поток курса Senior Java Developer с новой программой.
Что изменилось? Мы усилили курс новым модулем по кибербезопасности.
❓Зачем Java-разработчику разбираться в кибербезопасности? Логичный вопрос. И вот что мы ответим: наши партнеры провели опрос: на что бизнес обращает внимание при выборе платформы корпоративного банкинга. 100% ответов — защищенный доступ к финансам в личном кабинете с использованием двухфакторной аутентификации. Умеешь защищать данные при разработке — продукт еще больше ценят на рынке. Все просто!
✅ Итак, что тебя ждет на курсе:
- Развертывание приложений с помощью DevSecOps
- Моделирование схемы контроля доступа для систем и приложений
- Углубленное изучение Java Concurrency и Spring
- Архитектура — паттерны проектирования, Docker, Kubernetes
- Двойная сертификация по Java и кибербезопасности
💥И это лишь часть программы нового курса. Специально для тебя открыли 5 мест с индивидуальным менторским сопровождением. После прохождения шести образовательных модулей мы поможем тебе с трудоустройством у наших партнеров: Сбера, СДЭК и ЦБ.
➡️ Почитать подробности и оставить заявку можно здесь: https://clck.ru/3AJExx
Реклама. ООО "Платформа непрерывного обучения" ИНН 7839405924
erid: 2VtzqvhKyV2
🚀 12 мая мы запускаем юбилейный поток курса Senior Java Developer с новой программой.
Что изменилось? Мы усилили курс новым модулем по кибербезопасности.
❓Зачем Java-разработчику разбираться в кибербезопасности? Логичный вопрос. И вот что мы ответим: наши партнеры провели опрос: на что бизнес обращает внимание при выборе платформы корпоративного банкинга. 100% ответов — защищенный доступ к финансам в личном кабинете с использованием двухфакторной аутентификации. Умеешь защищать данные при разработке — продукт еще больше ценят на рынке. Все просто!
✅ Итак, что тебя ждет на курсе:
- Развертывание приложений с помощью DevSecOps
- Моделирование схемы контроля доступа для систем и приложений
- Углубленное изучение Java Concurrency и Spring
- Архитектура — паттерны проектирования, Docker, Kubernetes
- Двойная сертификация по Java и кибербезопасности
💥И это лишь часть программы нового курса. Специально для тебя открыли 5 мест с индивидуальным менторским сопровождением. После прохождения шести образовательных модулей мы поможем тебе с трудоустройством у наших партнеров: Сбера, СДЭК и ЦБ.
➡️ Почитать подробности и оставить заявку можно здесь: https://clck.ru/3AJExx
Реклама. ООО "Платформа непрерывного обучения" ИНН 7839405924
erid: 2VtzqvhKyV2
🔥5👍2