📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP
Вопросы с senior java интервью
Тайм-коды:
0:00 - Вступление
0:25 - Эти вопросы реально спрашивают
0:52 - Как устроен ролик
1:53 - Примитивы и доступ по значению (доступ всегда по значению)
3:53 - Пример с Boolean, который был несколько раз
4:58 - Хэш мапа и equals
6:00 - Как сломать мапу мутабельным ключом
7:30 - Плохое распределение хэшей
11:36 - Фреймворк коллекций (Collection framework)
12:30 - Устройство листов, почему linkedlist не используют в проде
13:50 - Иерархия исключений
14:48 - Optional и хитрости работы с ними
16:50 - Thread-local и то как его использовать
17:50 - Наследуемый Thread-local
19:20 - Стримы и примитивные стримы
22:25 - Хитрости try-catch-finally
23:38 - Try-with resource, Autoclosable
25:15 - Conditionalы, как создать свой стартер, логика конфигураций
28:05 - Жизненный цикл бинов, логика создания объектов
30:14 - Докер и зачем он нужен
источник
👉@BookJava
Подборка шпаргалок по Java
Основы синтаксиса;
Особенности Java;
Горячие клавиши в IntelliJ IDEA;
Лаконичное руководство по основам языка.
👉 @java_360
JavaDoc: добро или необходимое зло?
Привет! Меня зовут Андрей Костров, я старший разработчик в X5 Tech.
При создании проекта А мы вложили много сил в JavaDoc. Многим казалось это излишним. Затем проект А заморозили и начали новый – проект Б. При этом переиспользовали много кода из проекта А, вместе с JavaDoc. Рассказ о том, принёс ли JavaDoc пользу (спойлер: да). А также немного слов о том, где усилия по JavaDoc всё-таки были избыточны.
https://habr.com/ru/companies/X5Tech/articles/752338/
👉@BookJava
Удобная подсветка покрытия кода тестами в Merge Request GitLab
Основным средством для командной работы с репозиторием компании, в которой я работаю, является Gitlab. На первый взгляд, он хорош: и бесплатной версии хватает сполна, и CI/CD - пайплайн имеется, и хранить артефакты тоже можно (долой Nexus). Однако, и у GitLab есть свои минусы.
Так, например, разработчики до сих пор не смогли реализовать визуализацию покрытия тестов. Да, она у них есть, но для её реализации нужно сгенерировать и загрузить в GitLab отчет о покрытии в устаревшем формате Cobertura, а не в актуальном Jacoco. Основная же проблема в том, что Cobertura plugin последний раз обновлялся в далеком 2015 году.
https://habr.com/ru/articles/758066/
👉@BookJava
🧐Устали от ошибок? Позаботьтесь о чистоте архитектуры!
👉Узнайте как на бесплатном вебинаре онлайн-курса «Clojure Developer» — «Duct и Clean Architecture в Clojure»: регистрация
На бесплатном вебинаре мы:
— попрактикуемся применять принципы чистой архитектуры с использованием языка программирования Clojure и фреймворка Duct.
— познакомимся с его модульной системой, реализуем DI контейнер, подключим адаптеры во все порты и вообще сделаем все, как дедушка Боб нам завещал))
Экспертизой поделится руководитель программы и практик Сергей Ткаченко (Clojure Software developer / Team Lead).
🔥После вебинара вы сможете продолжить обучение на курсе по спеццене, в том числе, в рассрочку.Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Что такое phase, goal и lifecycle в Maven?
Phase – виртуальные шаги из, которых состоит lifecycle в Maven. Вообще, существует три жизненных цикла:
• Clean – фазы pre-clean, clean, post-clean;
• Default – validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy;
• Site – pre-site, site, post-site, site-deploy.
Goal – это конкретное выполняемое плагином действие. Плагин привязывает свои голы к фазам. Например, когда мы вызываем mvn clean
, работу по удалению файлов сборки делает не сама фаза clean, а привязанная к ней цель clean:clean из встроенного maven-clean-plugin
.
Когда аргументом команды mvn передается фаза, кроме нее самой выполнятся все предшествующие ей в том же лайфсайкле. Вместо фазы возможно явно передать цель (mvn clean:clean
вместо mvn clean
), но тогда никакие другие цели вызваны не будут (в данном примере цели фазы pre-clean
).
Фазы всегда выполняются в том порядке, в котором они следуют в жизненном цикле. Если к одной фазе привязано несколько целей, они отработают в порядке объявления в pom.xml.
Некоторые плагины могут предоставлять цели, не привязанные ни к каким фазам. Их можно вызвать только явно.
Если в команду mvn передается несколько фаз/целей, они выполнятся последовательно. Каждая цель в процессе выполняется только однажды.
Так, вызов mvn test package
– то же самое что mvn package, потому что в первом случае все цели из фазы test
(и предыдущих) уже будут исполнены и пропущены в package. mvn clean install
так заменить не получится, потому что это фазы из разных жизненных циклов.
👉@BookJava
Перестаём бояться генерировать байт-код
Многие, возможно, думают, что работа с байт-кодом Java (будь то чтение или, тем более, генерация) — это какая-то особенная магия, доступная только продвинутым разработчикам с особенно крутым опытом. На самом деле, я считаю такую точку зрения ошибочной. JVM устроена гораздо проще, чем CPU; она оперирует такими высокоуровневыми понятиями как классы, интерфейсы, методы, а не просто лопатит байты в памяти. В отличие от CPU, который легко уронить криво сгенерированным машинным кодом, JVM заботливо отверифицирует любой байт-код и в общем не даст выстрелить в ногу.
Но с чего начать погружение в байт-кодную магию? В сети есть некоторое количество туториалов по этому вопросу. Как мне кажется, они либо показывают слишком простые случаи, от которых непонятно, как перейти к чему-то более интересному, либо очень основательные и требуют вникать в теорию, собирать целиком картину в голове по кусочкам. Я хотел бы попробовать внести свой вклад в эту тему — надеюсь, у меня получится показать, как можно побороть первый страх и написать что-то похожее на реалистичный сценарий без особого вникания в теорию на первом этапе.
Весь приведённый код доступен в моём репозитории.
https://habr.com/ru/articles/759990/
👉@BookJava
Отличаются ли сокращенные и обычные операторы?
Java предлагает программисту сокращенную запись для применения операции с сохранением ответа в операнд. Это например +=
, &=
, и другие. Их правильное название – операторы сложного присваивания (compound assignment). Сокращенные версии есть для всех арифметических и битовых операторов.
У таких сокращений есть одно неочевидное отличие от полных версий. Если прочитать спецификацию, там сказано, что x += y
– это на самом деле сокращение от x = (XType)(x + y)
. То есть, кроме самой операции происходит приведение результата к типу левого операнда.
Незнание этой особенности может привести к ошибочно успешной компиляции, и неожиданным результатам работы кода.
👉@BookJava
Советы и рекомендации по работе с Java
https://medium.com/javarevisited/java-tips-tricks-4b188e70e170
👉@BookJava
Сгенерируйте случайное число в интервале
Когда мы сталкиваемся со случайными числами, то всегда должны помнить о вопросе их распределения. Не будем здесь углубляться в теорию мат. статистики, а рассмотрим только практические следствия.
Самые стандартные классы-генераторы случайных чисел создают равномерно распределенные значения. Любое число возникает с одинаковой вероятностью – это ожидаемое поведение для большинства задач. Например, метод Random.nextInt(1)
будет генерировать примерно одинаковое количество значений 0 и 1.
Однако, программист легко может "испортить" равномерность значений последующими операциями. Возьмем вместо предыдущего примера Random.nextInt(2)%2
. Такая конструкция тоже будет возвращать 0 или 1. Однако, третье возможное значение из генератора, 2, будет тоже превращено в 0. Значит, ответ 0 будет возникать в два раза чаще чем 1.
Это та причина, по которой лучше не пользоваться общепринятым «школьным» арифметическим ограничением с помощью оператора %
. Вместо этого следует оставить заботу о распределении разработчикам библиотеки, и пользоваться в прикладном коде готовыми методами с границами.
Если задача подразумевает более плотную работу с распределениями, стоит воспользоваться специализированной библиотекой вроде Apache Commons Math.
👉@BookJava
Разбираемся в «базовых» алгоритмах для проекта
Меня зовут Александр Певненко, я Java developer в СберТехе. Вместе с командой развиваю Platform V DataSpace — BaaS-продукт, обеспечивающий базовые сервисы для работы с данными.
В этой статье я собрал примерный список алгоритмов, которые использую в работе с высоконагруженным проектом с большой кодовой базой. Материал будет интересен всем, кто на практике решает задачи оптимизации и вообще задумывается, обязательно ли разработчику глубоко погружаться в математику.
Если скорость и производительность критичны для системы, то оптимизация кода перестает быть пустой тратой времени. А использование сторонних библиотек без понимания их устройства становится риском, так как может обернуться падением производительности.
Поэтому здесь я приведу несколько «базовых» алгоритмов, знание которых помогает мне работать с прицелом на эффективность кода, и дополню примерами на Python и Java.
https://habr.com/ru/companies/sberbank/articles/756894/
👉@BookJava
Java и современный процессор, Часть 1: Память и иерархия кэша
Разобравшись в том, как процессоры, память и кэш влияют на выполнение программ, вы сможете лучше понять производительность приложений и оптимизировать свой подход к их написанию.
Давайте представим, что у нас есть массив, содержащий 67 000 целочисленных элементов. Над этим массивом выполняются два цикла, как показано в Листинге 1. Оба эти цикла просто умножают элементы массива на три. Однако если первый цикл изменяет каждый элемент, то второй цикл изменяет только каждый 16-й элемент. Насколько быстрее будет работать второй цикл по сравнению с первым? Попробуйте угадать: в 16 раз быстрее?
Листинг 1. Какой цикл отработает быстрее?private static final int ARRAY_SIZE = 64 * 1024 * 1024;
public int[] array = new int[ARRAY_SIZE];
for (int i = 0, n = array.length; i < n; i++) {
array[i] *= 3;
}
for (int i = 0, n = array.length; i < n; i+=16) {
array[i] *= 3;
}
Rus https://habr.com/ru/companies/otus/articles/756450/
Eng https://blogs.oracle.com/javamagazine/post/java-and-the-modern-cpu-part-1-memory-and-the-cache-hierarchy
👉@BookJava
Могут ли потоки заменить циклы в Java?
Выход Java 8 стал знаменательным событием в истории Java. Появились потоки и Lambdas, которые сейчас широко используются. Если вы не знаете о потоках или никогда о них не слышали, это совершенно нормально. В большинстве случаев циклы удовлетворят ваши потребности, и у вас не будет проблем без потоков.
Тогда зачем нам нужны потоки? Могут ли они заменить циклы или иметь преимущества перед ними? В этой статье мы рассмотрим код, сравним производительность и посмотрим, насколько хороши потоки в качестве замены циклов.
https://betterprogramming.pub/can-streams-replace-loops-in-java-f56d4461743a
👉@BookJava
Привет! На связи организатор IT-конференций по разным направлениям разработки Podlodka Crew.
♨️ Приглашаем посетить третий сезон Podlodka Java Crew. Окунёмся в масштабную и важную для каждого Java-разработчика тему «Работа с базой данных» и рассмотрим её со всех возможных сторон. Ведь какой бэкенд без SQL?
В этом сезоне вас ждёт много дискуссий, мнений и нетворкинга. В программе не только технические доклады, но ещё и два публичных собеседования, воркшопы и круглый стол:
🔸 Поговорим про паттерны обработки данных - стриминг, батчи, cdc;
🔸 Узнаем, как не наступить на грабли сочетая Debezium с Postgres;
🔸 Разберёмся в тонкостях CRUD-сервисов: Spring, Jooq, PostgreSQL, Liquibase, Testcontainers
🔸 Сравним использование NoSQL и SQL баз данных на конкретных примерах.
🤓 А ещё в программе — традиционный бар на тему «Интеграция через базу — не антипаттерн» — обсудим и поделимся опытом.
🤑 Для ранних пташек — низкие цены! Посмотреть программу и купить билет со скидкой можно на сайте: https://podlodka.io/javacrew
Опишите синтаксис javadoc-комментария
Javadoc-комментарии к классам и их членам заключаются между /** и */. С точки зрения синтаксиса Java это обычные многострочные комментарии, но вторая * позволяет различным инструментам воспринимать их как документацию API. Изначально для этого использовалась стандартная утилита javadoc, которая генерировала HTML-документацию, сейчас джавадок активно используется прямо в IDE.
До Java 1.4 каждая строка комментария обязана была начинаться со *. Сейчас это требование необязательное, но следовать ему всё ещё принято.
Первое предложение комментария принимается в качестве заголовка описания элемента. В HTML именно оно попадает на страницу индекса. Предложение заканчивается точкой с последующим разделительным символом.
В javadoc разрешено использовать HTML-теги. Фрагменты кода рекомендуется обрамлять тегом <code>, для списка с буллетами применяется <ul>, параграфы отделяются <p>. В документации библиотеки Reactor активно используются <img> с диаграммами.
Комментарий состоит из двух частей: описание и блок тегов. Первый блок содержит всю информацию в свободной форме. Во втором находятся теги. Каждый тег начинается с новой строки, через пробел за ним следует значение.
Один тег можно использовать в блоке описания – @link
. Он не обязан быть на новой строке, обрамляется фигурными скобками, и при рендеринге превращается в <a> со ссылкой на другую страницу документации.
Среди всех тегов обязательными считаются только @param
для каждого параметра метода, и @return
для не-void методов. Они применимы только для методов. А теги @author
и @version
наоборот, используются только в документации классов. Остальные блочные теги можно использовать везде:
• @deprecated
• @exception (то же что @throws)
• @see
• @since
• @serial
(то же что @serialField
или @serialData
)
Теги @author
, @param
, @throws
и @see
могут входить в один комментарий в нескольких экземплярах.
👉@BookJava
Погрузитесь в мир ☕️ Java и станьте Java-разработчиком за 4 месяца с курсом от Merion Academy!
Все, кому интересно, получат 🚀 3 бесплатных урока, 📍 Мы расскажем про то, что из себя представляет язык Java и его базовый синтаксис.
📍 Установите Java и среду разработки где будете писать код.
📍 Напишете свою первую консольную программу, а после нее и REST API приложение.
📍 А в конце закрепите полученные знания.
🎁 Бонус – интенсив по развитию карьеры, где HR-эксперты расскажут как создавать сильные резюме и проходить собеседования.
📜 Плюс гайд по базовому синтакису языка.
🕺У ребят одна из самых доступных цен, которая в разы ниже, чем в других онлайн-школах, а еще есть рассрочка для тех, кто хочет учиться сейчас и платить по чуть-чуть ежемесячно.
👉 Регистрируйтесь по ссылке чтобы забрать бесплатные уроки, интенсив по карьере и гайд.
Merion Academy – это экосистема доступного образования, которая включает в себя:
📍IT-базу знаний с полезными статьями.
📍merionacademy">Youtube-канал ,где простыми словами говорят о сложных вещах.
📍IT-академию, где обучат востребованным направлениям по самым доступным ценам.
Бесплатный пробный урок английского в UFirst!
Приглашаем на демо-урок по английскому языку. Все как на обычном уроке, только бесплатно!
Для детей 3-17 лет.
Познакомьтесь со школой, преподавателем, методикой, чтобы выбрать лучшее место для изучения английского.
Хотите попробовать? Бронируйте места в школах Москвы, Санкт-Петербурга и Новосибирска.
Забронировать
#реклама
ufirst.ru
О рекламодателе
Стань Тестировщиком и получи работу через 4 месяца!
Самая актуальная удаленная профессия 2024 года!
Тестировщик сайтов и мобильных приложений - IT профессия без кодинга, математики и технического образования.
Вы научитесь проверять работу сайтов и приложений, находить ошибки и прогнозировать сбои.
Во время учебы соберете портфолио из 14 проектов, а через 4 месяца получите первую работу!
**Курс участвует в осенней распродаже до -45%!
Подать заявку
#реклама
bangbangeducation.ru
О рекламодателе
Чем IllegalArgumentException лучше чем NullPointerException?
Phase – виртуальные шаги из, которых состоит lifecycle в Maven. Вообще, существует три жизненных цикла:
• Clean – фазы pre-clean, clean, post-clean;
• Default – validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy;
• Site – pre-site, site, post-site, site-deploy.
Goal – это конкретное выполняемое плагином действие. Плагин привязывает свои голы к фазам. Например, когда мы вызываем mvn clean
, работу по удалению файлов сборки делает не сама фаза clean
, а привязанная к ней цель clean:clean
из встроенного maven-clean-plugin
.
Когда аргументом команды mvn
передается фаза, кроме нее самой выполнятся все предшествующие ей в том же лайфсайкле. Вместо фазы возможно явно передать цель (mvn clean:clean
вместо mvn clean
), но тогда никакие другие цели вызваны не будут (в данном примере цели фазы pre-clean
).
Фазы всегда выполняются в том порядке, в котором они следуют в жизненном цикле. Если к одной фазе привязано несколько целей, они отработают в порядке объявления в pom.xml.
Некоторые плагины могут предоставлять цели, не привязанные ни к каким фазам. Их можно вызвать только явно.
Если в команду mvn
передается несколько фаз/целей, они выполнятся последовательно. Каждая цель в процессе выполняется только однажды.
Так, вызов mvn test package
– то же самое что mvn package
, потому что в первом случае все цели из фазы test (и предыдущих) уже будут исполнены и пропущены в package. mvn clean instal
l так заменить не получится, потому что это фазы из разных жизненных циклов.
👉@BookJava
Изучение основ Spring для начинающих - полный курс
Module 1: Course Overview
Module 2: Set up the development Environment
Module 3: Spring Core Introduction
Module 4: XML Based configuration
Module 5: Autowiring
Module 6: Java Configuration
Module 7: Spring Beans in Depth
Module 8: Spring Aspect Oriented Programming
Module 9: Spring Task Executor
Module 10: Communication between Beans - ApplicationEvent Management
Module 11: Conclusion
https://www.youtube.com/watch?v=DrMmHTHTcCo
👉@BookJava
Лямбды — гибкие и анонимные фрагменты кода
Лямбды в Java полезны во многих направлениях. Лямбда-выражения можно использовать для более простых задач, а лямбда-утверждения — для более сложных. Лямбды могут вызывать другие методы для текущего объекта (this) и объектов, которые находятся в области видимости, таких как текущий элемент итерации и конечная локальная переменная за пределами лямбды. Лямбду всегда можно упростить, поместив код в другой метод.
Написание хороших лямбд требует дисциплины. Например, важно называть параметры понятным образом — так, чтобы названия раскрывали их назначение. Вот простой пример лямбды для фильтрации списка строк:@Test
public void filterStringsLambda()
{
var list = Lists.mutable.with(
"Atlanta",
"Atlantic City",
"Boston",
"Boca Raton");
var actual = list.stream()
.filter(string -> string.startsWith("At"))
.collect(Collectors.toList());
var expected = List.of("Atlanta", "Atlantic City");
Assertions.assertEquals(expected, actual);
}
https://medium.com/javarevisited/the-elusive-and-beautiful-java-method-reference-97e566d2088b
👉@BookJava
Управление зависимостями в IntelliJ IDEA
В этом руководстве, в продолжение темы просмотра зависимостей, мы рассмотрим управление зависимостями в IntelliJ IDEA.
Мы рассмотрим различные способы добавления зависимостей в ваш проект, а также способы добавления, обновления и удаления зависимостей с помощью Package Search.
https://habr.com/ru/post/710802/
👉@BookJava
Борьба с временем ответа сервиса
Работаю сейчас в довольно крупной компании на позиции ведущего разработчика с ролью TL. Занимаюсь разработкой сервиса, который в обозримом будущем станет принимать приличную нагрузку. И по договоренностям с клиентами время ответа (HTTP) нашего сервиса должно быть не более 65мс.
Когда я пришел в компанию в июне 2022 года, время ответа уже составляло примерно 50мс при нагрузке в пике около 80 RPS. Стек на тот момент: Java 11 (Spring MVC) + PostgreSQL + Apache Ignite в качестве кэша.
https://habr.com/ru/articles/767042/
👉@BookJava
Используем Elasticsearch вместе со Spring Boot
В это статье я хочу рассказать о том, как мы можем интегрировать Elasticsearch в наше приложение на Spring Boot. Этот проект предназначен для ознакомления с технологиями и служит скорее шпаргалкой/пособием или же фундаментом для дальнейшего погружения в тему.
В эру огромных объемов данных осуществление эффективного поиска является ключевым фактором для успешного бизнеса. К счастью, разработчикам сегодня доступны инструменты, которые могут справиться с такими задачами, одним из которых является Elasticsearch.
Elasticsearch - это мощный и гибкий open-source инструмент, который позволяет создавать быстрые и масштабируемые системы для поиска и анализа данных. Он представляет собой распределенную поисковую и аналитическую систему, которая может интегрироваться с многими современными технологиями.
В этой статье мы рассмотрим, как интегрировать Elasticsearch в Spring Boot приложение для поиска пассажиров в контексте авиаперевозок. Это полезный пример, который поможет нам детально изучить, как Elasticsearch может быть использован в реальных проектах.
Будем изучать основные концепции Elasticsearch и его преимущества, а также подробно рассмотрим проект, использующий Elasticsearch для выполнения запросов на основе данных о пассажирах. Вы также узнаете, как написать код на Java для реализации функциональности поиска пассажиров с помощью Elasticsearch.
Итак, пристегните ремни, дорогие читатели, мы начинаем наше путешествие в мире Elasticsearch и Spring Boot!
https://habr.com/ru/articles/766674/
👉@BookJava
⁉️ Как создать TCP/IP-серверное приложение в Java?
Стек протоколов TCP/IP позволяет обеспечивать доставку информации в необходимое место назначения. Умение с ней работать – важный скилл для разработчика.
🦾 Изучите эту технологию на бесплатном открытом уроке «TCP/IP-сервер в Java» от OTUS.
На эфире:
- Посмотрим, какие есть варианты реализации TCP/IP-серверного приложения в Java.
- Изучим пару примеров, их особенности и области применения.
📌 Занятие пройдёт 17 октября в 20:00 мск в рамках курса «Java Developer. Professional». После бесплатного вебинара вы сможете продолжить обучение на курсе в рассрочку.
Это отличная возможность совершенно бесплатно протестировать формат обучения и задать преподавателю любые вопросы в режиме реального времени!
👉 Зарегистрируйтесь на событие прямо сейчас, чтобы ничего не пропустить.Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Следующая локация IT Talk by Sber для Java и QA-специалистов — Омск! 💻
Митап состоится уже 26 октября. На нём топовые спикеры расскажут о том, как реализуются задачи по разработке и тестировании в Сбере:
✔️ Егор Курилов раскроет все секреты нагрузочного тестирования Java-приложений.
✔️ Евгений Ляшенко объяснит, что же такое — релизный поезд веб-приложений.
✔️ А Дмитрий Лысаченко и Максим Нелин подискутируют о развитии больших языковых моделей от GPT до GigaChat.
Помимо интересных докладов, всех участников будет ждать игра «Интуиция», фуршет и очень много классного общения.
Встречаемся 26 октября в ресторации «Рига-Москва» по адресу: ул. Маяковского, 74. Регистрируйтесь по ссылке! 💚
Лишает ли var строгой типизации?
Ключевое слово var
появилось в Java 10. Указание var
вместо типа локальной переменной применяет к ней механизм вывода типов (type inference). Тип будет вычислен на этапе компиляции из того, чем переменная инициализируется.
Отсюда несколько выводов. Во-первых, нельзя использовать var в полях класса, параметрах метода, и где-либо еще кроме локальных переменных. Во-вторых, обязана быть инициализация с понятным типом – варианты var x
; или var x = null
; не скомпилируются.
И главное следствие – к концу компиляции у таких переменных фиксированный и известный тип, который не может быть изменен позднее. А это и есть определение строгой типизации.
Ответ: нет, выводимый тип – строгий. Более того, типизация остается статической.
Главное упущение – в инициализации разрешено использовать diamond operator. В обычных обстоятельствах в нём выведется правильный generic-тип, но в случае var
информации недостаточно, и типом-параметром будет Object
.
👉@BookJava
Когда стоит выбрать char[] вместо String?
Первая, очевидная причина – оптимизация. Если вам заранее известен размер строки, и он фиксирован, может быть полезно выбрать массив. Если программа работает с неизменяемыми подстроками, удобно представить их в виде offset-ов общего массива.
Следует помнить, что оптимизировать нужно осознанно и своевременно. JVM тоже прикладывает усилия по оптимизации строк, которые могут оказаться эффективнее ваших.
Вторая, менее очевидная причина – безопасность. Строки в Java иммутабельны. Это значит, что когда вы сохраняете пароль в объекте типа String, физически уничтожить его из памяти может только сборщик мусора.
Существует способ алгоритмической атаки на систему, когда хакер своими действиями вызывает переполнение памяти, и конфиденциальная информация попадает в heap dump.
Если пароль хранится в массиве, программист может самостоятельно «занулить» значение после использования.
👉@BookJava
Прожарка java.lang.String
Давайте абьюзить баг в java.lang.String, который позволит делать очень странные строки. Мы сделаем "Hello World", который не начинается с "Hello" и покажем, что не все пустые строки равны между собой. Научимся прожаривать строки в чужих классах.
Rus https://habr.com/ru/companies/bar/articles/747528/
Eng https://wouter.coekaerts.be/2023/breaking-string
👉@BookJava
Под каким типом хранить период времени?
В стандартной библиотеке современных версий Java для этих целей есть два класса:Period
– календарный период. Количество дней, месяцев и лет. Одним днем здесь считается день в терминах ZonedDateTime
.
Duration – длительность времени. Количество наносекунд, секунд, минут, часов, и тоже дней. Здесь один день – ровно 24 часа.
Оба класса реализуют общий интерфейс TemporalAmount
– период времени вообще. Оба иммутабельны, и как следствие, потокобезопасны. Любая модифицирующая операция вроде plusX()
возвращает новый экземпляр с измененным значением.
Экземпляры обоих классов могут быть созданы из значений отдельных компонентов, из двух моментов времени методом between, или из строки. Строковое представление Duration: "P2DT3H4M
", Period: "P1Y2M3D
".
До Java 8 основным способом хранения периода были числовые примитивы. В этом подходе есть много недостатков, среди которых в первую очередь неограниченность значений и ненаглядность. Чтобы в Java 8+ получить период числом, используется метод between()
нужного элемента енама ChronoUnit
.
👉@BookJava