Лишает ли var строгой типизации?
Ключевое слово
Отсюда несколько выводов. Во-первых, нельзя использовать var в полях класса, параметрах метода, и где-либо еще кроме локальных переменных. Во-вторых, обязана быть инициализация с понятным типом – варианты
И главное следствие – к концу компиляции у таких переменных фиксированный и известный тип, который не может быть изменен позднее. А это и есть определение строгой типизации.
Ответ: нет, выводимый тип – строгий. Более того, типизация остается статической.
Главное упущение – в инициализации разрешено использовать diamond operator. В обычных обстоятельствах в нём выведется правильный generic-тип, но в случае
👉@BookJava
Ключевое слово
var
появилось в Java 10. Указание var
вместо типа локальной переменной применяет к ней механизм вывода типов (type inference). Тип будет вычислен на этапе компиляции из того, чем переменная инициализируется.Отсюда несколько выводов. Во-первых, нельзя использовать var в полях класса, параметрах метода, и где-либо еще кроме локальных переменных. Во-вторых, обязана быть инициализация с понятным типом – варианты
var x
; или var x = null
; не скомпилируются.И главное следствие – к концу компиляции у таких переменных фиксированный и известный тип, который не может быть изменен позднее. А это и есть определение строгой типизации.
Ответ: нет, выводимый тип – строгий. Более того, типизация остается статической.
Главное упущение – в инициализации разрешено использовать diamond operator. В обычных обстоятельствах в нём выведется правильный generic-тип, но в случае
var
информации недостаточно, и типом-параметром будет Object
.👉@BookJava
👍4
Разбираемся в «базовых» алгоритмах для проекта
Меня зовут Александр Певненко, я Java developer в СберТехе. Вместе с командой развиваю Platform V DataSpace — BaaS-продукт, обеспечивающий базовые сервисы для работы с данными.
В этой статье я собрал примерный список алгоритмов, которые использую в работе с высоконагруженным проектом с большой кодовой базой. Материал будет интересен всем, кто на практике решает задачи оптимизации и вообще задумывается, обязательно ли разработчику глубоко погружаться в математику.
Если скорость и производительность критичны для системы, то оптимизация кода перестает быть пустой тратой времени. А использование сторонних библиотек без понимания их устройства становится риском, так как может обернуться падением производительности.
Поэтому здесь я приведу несколько «базовых» алгоритмов, знание которых помогает мне работать с прицелом на эффективность кода, и дополню примерами на Python и Java.
https://habr.com/ru/companies/sberbank/articles/756894/
👉@BookJava
Меня зовут Александр Певненко, я Java developer в СберТехе. Вместе с командой развиваю Platform V DataSpace — BaaS-продукт, обеспечивающий базовые сервисы для работы с данными.
В этой статье я собрал примерный список алгоритмов, которые использую в работе с высоконагруженным проектом с большой кодовой базой. Материал будет интересен всем, кто на практике решает задачи оптимизации и вообще задумывается, обязательно ли разработчику глубоко погружаться в математику.
Если скорость и производительность критичны для системы, то оптимизация кода перестает быть пустой тратой времени. А использование сторонних библиотек без понимания их устройства становится риском, так как может обернуться падением производительности.
Поэтому здесь я приведу несколько «базовых» алгоритмов, знание которых помогает мне работать с прицелом на эффективность кода, и дополню примерами на Python и Java.
https://habr.com/ru/companies/sberbank/articles/756894/
👉@BookJava
👍6
Сгенерируйте случайное число в интервале
Когда мы сталкиваемся со случайными числами, то всегда должны помнить о вопросе их распределения. Не будем здесь углубляться в теорию мат. статистики, а рассмотрим только практические следствия.
Самые стандартные классы-генераторы случайных чисел создают равномерно распределенные значения. Любое число возникает с одинаковой вероятностью – это ожидаемое поведение для большинства задач. Например, метод
Однако, программист легко может "испортить" равномерность значений последующими операциями. Возьмем вместо предыдущего примера
Это та причина, по которой лучше не пользоваться общепринятым «школьным» арифметическим ограничением с помощью оператора
Если задача подразумевает более плотную работу с распределениями, стоит воспользоваться специализированной библиотекой вроде Apache Commons Math.
👉@BookJava
Когда мы сталкиваемся со случайными числами, то всегда должны помнить о вопросе их распределения. Не будем здесь углубляться в теорию мат. статистики, а рассмотрим только практические следствия.
Самые стандартные классы-генераторы случайных чисел создают равномерно распределенные значения. Любое число возникает с одинаковой вероятностью – это ожидаемое поведение для большинства задач. Например, метод
Random.nextInt(1)
будет генерировать примерно одинаковое количество значений 0 и 1.Однако, программист легко может "испортить" равномерность значений последующими операциями. Возьмем вместо предыдущего примера
Random.nextInt(2)%2
. Такая конструкция тоже будет возвращать 0 или 1. Однако, третье возможное значение из генератора, 2, будет тоже превращено в 0. Значит, ответ 0 будет возникать в два раза чаще чем 1.Это та причина, по которой лучше не пользоваться общепринятым «школьным» арифметическим ограничением с помощью оператора
%
. Вместо этого следует оставить заботу о распределении разработчикам библиотеки, и пользоваться в прикладном коде готовыми методами с границами.Если задача подразумевает более плотную работу с распределениями, стоит воспользоваться специализированной библиотекой вроде Apache Commons Math.
👉@BookJava
👍5❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Используем 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
В это статье я хочу рассказать о том, как мы можем интегрировать 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
👍2
Советы и рекомендации по работе с Java
https://medium.com/javarevisited/java-tips-tricks-4b188e70e170
👉@BookJava
https://medium.com/javarevisited/java-tips-tricks-4b188e70e170
👉@BookJava
Борьба с временем ответа сервиса
Работаю сейчас в довольно крупной компании на позиции ведущего разработчика с ролью TL. Занимаюсь разработкой сервиса, который в обозримом будущем станет принимать приличную нагрузку. И по договоренностям с клиентами время ответа (HTTP) нашего сервиса должно быть не более 65мс.
Когда я пришел в компанию в июне 2022 года, время ответа уже составляло примерно 50мс при нагрузке в пике около 80 RPS. Стек на тот момент: Java 11 (Spring MVC) + PostgreSQL + Apache Ignite в качестве кэша.
https://habr.com/ru/articles/767042/
👉@BookJava
Работаю сейчас в довольно крупной компании на позиции ведущего разработчика с ролью TL. Занимаюсь разработкой сервиса, который в обозримом будущем станет принимать приличную нагрузку. И по договоренностям с клиентами время ответа (HTTP) нашего сервиса должно быть не более 65мс.
Когда я пришел в компанию в июне 2022 года, время ответа уже составляло примерно 50мс при нагрузке в пике около 80 RPS. Стек на тот момент: Java 11 (Spring MVC) + PostgreSQL + Apache Ignite в качестве кэша.
https://habr.com/ru/articles/767042/
👉@BookJava
Хабр
Борьба с временем ответа сервиса
Работаю сейчас в довольно крупной компании на позиции ведущего разработчика с ролью TL. Занимаюсь разработкой сервиса, который в обозримом будущем станет принимать приличную нагрузку. И по...
👍3
Отличаются ли сокращенные и обычные операторы?
Java предлагает программисту сокращенную запись для применения операции с сохранением ответа в операнд. Это например
У таких сокращений есть одно неочевидное отличие от полных версий. Если прочитать спецификацию, там сказано, что
Незнание этой особенности может привести к ошибочно успешной компиляции, и неожиданным результатам работы кода.
👉@BookJava
Java предлагает программисту сокращенную запись для применения операции с сохранением ответа в операнд. Это например
+=
, &=
, и другие. Их правильное название – операторы сложного присваивания (compound assignment). Сокращенные версии есть для всех арифметических и битовых операторов.У таких сокращений есть одно неочевидное отличие от полных версий. Если прочитать спецификацию, там сказано, что
x += y
– это на самом деле сокращение от x = (XType)(x + y)
. То есть, кроме самой операции происходит приведение результата к типу левого операнда.Незнание этой особенности может привести к ошибочно успешной компиляции, и неожиданным результатам работы кода.
👉@BookJava
👍8
Управление зависимостями в IntelliJ IDEA
В этом руководстве, в продолжение темы просмотра зависимостей, мы рассмотрим управление зависимостями в IntelliJ IDEA.
Мы рассмотрим различные способы добавления зависимостей в ваш проект, а также способы добавления, обновления и удаления зависимостей с помощью Package Search.
https://habr.com/ru/post/710802/
👉@BookJava
В этом руководстве, в продолжение темы просмотра зависимостей, мы рассмотрим управление зависимостями в IntelliJ IDEA.
Мы рассмотрим различные способы добавления зависимостей в ваш проект, а также способы добавления, обновления и удаления зависимостей с помощью Package Search.
https://habr.com/ru/post/710802/
👉@BookJava
👍3
Перестаём бояться генерировать байт-код
Многие, возможно, думают, что работа с байт-кодом Java (будь то чтение или, тем более, генерация) — это какая-то особенная магия, доступная только продвинутым разработчикам с особенно крутым опытом. На самом деле, я считаю такую точку зрения ошибочной. JVM устроена гораздо проще, чем CPU; она оперирует такими высокоуровневыми понятиями как классы, интерфейсы, методы, а не просто лопатит байты в памяти. В отличие от CPU, который легко уронить криво сгенерированным машинным кодом, JVM заботливо отверифицирует любой байт-код и в общем не даст выстрелить в ногу.
Но с чего начать погружение в байт-кодную магию? В сети есть некоторое количество туториалов по этому вопросу. Как мне кажется, они либо показывают слишком простые случаи, от которых непонятно, как перейти к чему-то более интересному, либо очень основательные и требуют вникать в теорию, собирать целиком картину в голове по кусочкам. Я хотел бы попробовать внести свой вклад в эту тему — надеюсь, у меня получится показать, как можно побороть первый страх и написать что-то похожее на реалистичный сценарий без особого вникания в теорию на первом этапе.
Весь приведённый код доступен в моём репозитории.
https://habr.com/ru/articles/759990/
👉@BookJava
Многие, возможно, думают, что работа с байт-кодом Java (будь то чтение или, тем более, генерация) — это какая-то особенная магия, доступная только продвинутым разработчикам с особенно крутым опытом. На самом деле, я считаю такую точку зрения ошибочной. JVM устроена гораздо проще, чем CPU; она оперирует такими высокоуровневыми понятиями как классы, интерфейсы, методы, а не просто лопатит байты в памяти. В отличие от CPU, который легко уронить криво сгенерированным машинным кодом, JVM заботливо отверифицирует любой байт-код и в общем не даст выстрелить в ногу.
Но с чего начать погружение в байт-кодную магию? В сети есть некоторое количество туториалов по этому вопросу. Как мне кажется, они либо показывают слишком простые случаи, от которых непонятно, как перейти к чему-то более интересному, либо очень основательные и требуют вникать в теорию, собирать целиком картину в голове по кусочкам. Я хотел бы попробовать внести свой вклад в эту тему — надеюсь, у меня получится показать, как можно побороть первый страх и написать что-то похожее на реалистичный сценарий без особого вникания в теорию на первом этапе.
Весь приведённый код доступен в моём репозитории.
https://habr.com/ru/articles/759990/
👉@BookJava
👍2
Лямбды — гибкие и анонимные фрагменты кода
Лямбды в Java полезны во многих направлениях. Лямбда-выражения можно использовать для более простых задач, а лямбда-утверждения — для более сложных. Лямбды могут вызывать другие методы для текущего объекта (this) и объектов, которые находятся в области видимости, таких как текущий элемент итерации и конечная локальная переменная за пределами лямбды. Лямбду всегда можно упростить, поместив код в другой метод.
Написание хороших лямбд требует дисциплины. Например, важно называть параметры понятным образом — так, чтобы названия раскрывали их назначение. Вот простой пример лямбды для фильтрации списка строк:
https://medium.com/javarevisited/the-elusive-and-beautiful-java-method-reference-97e566d2088b
👉@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
👍4
Что такое 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 передается фаза, кроме нее самой выполнятся все предшествующие ей в том же лайфсайкле. Вместо фазы возможно явно передать цель (
Фазы всегда выполняются в том порядке, в котором они следуют в жизненном цикле. Если к одной фазе привязано несколько целей, они отработают в порядке объявления в pom.xml.
Некоторые плагины могут предоставлять цели, не привязанные ни к каким фазам. Их можно вызвать только явно.
Если в команду mvn передается несколько фаз/целей, они выполнятся последовательно. Каждая цель в процессе выполняется только однажды.
Так, вызов
👉@BookJava
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
👍3
Изучение основ 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
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
YouTube
Learn Spring Fundamentals for Beginners - Full Course
Learn about Spring Fundamentals in this full course for beginners. You'll learn: Core Concepts, Dependency Injection, Bean Configuration, Autowiring, AOP, SpEL, and more
Build a Microservices Architecture with Spring Boot and Spring Cloud
☞ https://morio…
Build a Microservices Architecture with Spring Boot and Spring Cloud
☞ https://morio…
👍3
Чем 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 – это конкретное выполняемое плагином действие. Плагин привязывает свои голы к фазам. Например, когда мы вызываем
Когда аргументом команды
Фазы всегда выполняются в том порядке, в котором они следуют в жизненном цикле. Если к одной фазе привязано несколько целей, они отработают в порядке объявления в pom.xml.
Некоторые плагины могут предоставлять цели, не привязанные ни к каким фазам. Их можно вызвать только явно.
Если в команду
Так, вызов
👉@BookJava
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
😁7❤2👍1
Удобная подсветка покрытия кода тестами в Merge Request GitLab
Основным средством для командной работы с репозиторием компании, в которой я работаю, является Gitlab. На первый взгляд, он хорош: и бесплатной версии хватает сполна, и CI/CD - пайплайн имеется, и хранить артефакты тоже можно (долой Nexus). Однако, и у GitLab есть свои минусы.
Так, например, разработчики до сих пор не смогли реализовать визуализацию покрытия тестов. Да, она у них есть, но для её реализации нужно сгенерировать и загрузить в GitLab отчет о покрытии в устаревшем формате Cobertura, а не в актуальном Jacoco. Основная же проблема в том, что Cobertura plugin последний раз обновлялся в далеком 2015 году.
https://habr.com/ru/articles/758066/
👉@BookJava
Основным средством для командной работы с репозиторием компании, в которой я работаю, является Gitlab. На первый взгляд, он хорош: и бесплатной версии хватает сполна, и CI/CD - пайплайн имеется, и хранить артефакты тоже можно (долой Nexus). Однако, и у GitLab есть свои минусы.
Так, например, разработчики до сих пор не смогли реализовать визуализацию покрытия тестов. Да, она у них есть, но для её реализации нужно сгенерировать и загрузить в GitLab отчет о покрытии в устаревшем формате Cobertura, а не в актуальном Jacoco. Основная же проблема в том, что Cobertura plugin последний раз обновлялся в далеком 2015 году.
https://habr.com/ru/articles/758066/
👉@BookJava
👍2
JavaDoc: добро или необходимое зло?
Привет! Меня зовут Андрей Костров, я старший разработчик в X5 Tech.
При создании проекта А мы вложили много сил в JavaDoc. Многим казалось это излишним. Затем проект А заморозили и начали новый – проект Б. При этом переиспользовали много кода из проекта А, вместе с JavaDoc. Рассказ о том, принёс ли JavaDoc пользу (спойлер: да). А также немного слов о том, где усилия по JavaDoc всё-таки были избыточны.
https://habr.com/ru/companies/X5Tech/articles/752338/
👉@BookJava
Привет! Меня зовут Андрей Костров, я старший разработчик в X5 Tech.
При создании проекта А мы вложили много сил в JavaDoc. Многим казалось это излишним. Затем проект А заморозили и начали новый – проект Б. При этом переиспользовали много кода из проекта А, вместе с JavaDoc. Рассказ о том, принёс ли JavaDoc пользу (спойлер: да). А также немного слов о том, где усилия по JavaDoc всё-таки были избыточны.
https://habr.com/ru/companies/X5Tech/articles/752338/
👉@BookJava
👍3
Forwarded from Книги по Java | Books Java 📚
12992683-dzone-refcard318-java13.pdf
1 MB
Подборка шпаргалок по Java
Основы синтаксиса;
Особенности Java;
Горячие клавиши в IntelliJ IDEA;
Лаконичное руководство по основам языка.
👉 @java_360
Основы синтаксиса;
Особенности Java;
Горячие клавиши в IntelliJ IDEA;
Лаконичное руководство по основам языка.
👉 @java_360
👍7
Media is too big
VIEW IN TELEGRAM
Вопросы с 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
Тайм-коды:
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
👍5🤔2❤1👎1