Уроки Java для начинающих
#1 — Установка JDK и IDE
#2 — Переменные. Примитивные типы данных
#3 — Строки (String). Ссылочные типы данных
#4 — Условные конструкции (if-else, switch-case)
#5 — Цикл for
#6— Циклы While и Do While
#7 — Консольный ввод данных
#8 — Массивы
#9 — Многомерные массивы
#10 — Классы и объекты
источник
👉@BookJava
Как работает память Java?
Прежде чем мы перейдем к вопросам производительности, нам нужно узнать, что на самом деле происходит в фоновом режиме JVM (Java Virtual Machine). Это отправная точка для каждого разработчика, который хочет изучить и настроить производительность, чтобы набрать скорость. Итак, давайте погрузимся в мир кодов.
В Java управление памятью осуществляется JVM автоматически для хранения ваших переменных, классов, полей и так далее... Первое, что мы узнаем, это то, что в JVM память разделена на две области. Одна из них называется Stack, а другая - Heap.
https://blog.stackademic.com/how-java-memory-works-c751460e3cbd
👉@BookJava
💪 Пройди тест по Java и проверь свои знания.
Ответишь — пройдешь на продвинутый курс "Java Developer. Professional" от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса🎁 .
🌲 А ещё, сейчас действуют новогодние скидки! Возможна оплата в рассрочку! Предложение ограничено.
👉 ПРОЙТИ ТЕСТ: https://vk.cc/ctqXSyРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Как разбить строку на слова?
StringTokenizer – специально предназначенный для этого класс стандартной библиотеки Java. Ему нужно задать разделители, по ним строка будет разделена на «токены». Это устаревший класс, он остается в библиотеке только для обратной совместимости.
Вместо него рекомендуется использовать метод String.split()
. Метод принимает строку с регулярным выражением, и опциональный лимит токенов. Реализация особенно оптимизирована для односимвольного разделителя. Но следует помнить, что даже если символ один, это всё ещё регулярное выражение – спецсимвол должен экранироваться.
Другой подходящий метод – Pattern.split()
. Он, наоборот, вызывается у регулярного выражения, а принимает целевую строку. В этот же метод делегируется и выполнение String.split()
. Этот способ предпочтительнее, когда в регулярном выражении больше одного символа, а скомпилированный паттерн применяется повторно.
👉@BookJava
Операция «K». Ищем баги в коде IntelliJ IDEA
В этой статье мы проверим проект IntelliJ IDEA Community Edition на наличие ошибок и отправим наши правки разработчикам. Крупный проект, Open Source база и использование статического анализатора при разработке. Сложная задача для PVS-Studio.
https://habr.com/ru/companies/pvs-studio/articles/780560/
👉@BookJava
⚡️ Профессия Java-разработчик с нуля и до востребованного специалиста!
Уже 29 декабря стартует новая группа специализации «Java Developer» в OTUS.
👩💻 С нуля до Middle за 15 месяцев!
На онлайн-курсе вы получите:
➡️ Уникальные знания от преподавателей — Senior Java-разработчиков ведущих IT-компаний.
➡️ Практику создания реальных проектов — разработка своего серверного приложения на Java
➡️ Актуальные навыки, необходимые для трудоустройства Middle Java-разработчиком
➡️ Вы освоите инструменты: IntelliJ IDEA, Java Development Kit (JDK), Spring Framework, Hibernate, PostgreSQL, Apache Maven, Gradle, Docker, Kubernetes, Apache Kafka, RabbitMQ, JUnit, Postman, Jira.
👉 Получить специальные условия на курс можно оставив заявку по ссылке: https://vk.cc/ctmBSF
🌲 А ещё, сейчас действуют новогодние скидки! Предложение ограничено.Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Какой способ логирования выбрать?
Библиотеки логирования, ставшие стандартом де-факто, в хронологическом порядке их появления:
• java.util.Logging из стандартной библиотеки
• Log4j (deprecated)
• Logback
• Log4j 2
Все эти библиотеки поддерживают основные фичи: уровни логирования (что писать), различные хэндлеры (куда писать), форматы (как писать). Развитие библиотек происходило последовательно, в нюансах каждая из них учитывала ошибки предыдущей, сохраняя её преимущества. Обычно выбирают самые свежие варианты – Logback и Log4j 2.
Для совмещения нескольких решений в одном проекте существуют библиотеки-фасады, которые подставляют разные реализации под общий интерфейс:
• SLF4j
• Apache Commons Logging (JCL)
Кроме того, можно использовать bridge-библиотеки. Они маскируют одну реализацию непосредственно под интерфейс другой. С их помощью, например, можно уместить в одном проекте использование двух разных фасадов, или обойтись вовсе без фасадов.
👉@BookJava
Совет 💡
Обычно при сортировке в Spring Data мы указываем свойство, по которому хотим отсортировать, как строку. Однако существует класс TypedSort
, который дает нам возможность передавать функцию в качестве параметра для сортировки. Это повышает безопасность типов в нашем коде.
👉@BookJava
Как остановить поток?
В Java поток представлен классом Thread
. В нём есть метод stop()
, но пользоваться им нельзя, метод помечен как deprecated. Такая жесткая остановка моментально возвращает все захваченные потоком мониторы, и защищенные ими данные могут оказаться в неконсистентном состоянии.
Разработчики рекомендуют вместо этого использовать флаг, который будет показывать о намерении остановить поток. Флаг выставляется извне потока, а внутри проверяется в подходящий момент. Если нужно остановиться, поток просто выходит из метода run()
. В качестве такого флага подойдет переменная типа AtomicBoolean
.
Когда в потоке используются блокирующие операции, обычно для определенного типа операции существует свой способ её прервать. Например, можно закрыть сокет, на котором поток ожидает. Для большинства блокирующих операций сработает метод Thread.interrupt()
. С его помощью можно прервать Object.wait() и операции из NIO.
Останется только правильно обработать такое прерывание. Прерванный wait()
выбросит InterruptedException
, Selector.select()
вернет результат. Чтобы отличить осознанное прерывание с целью завершить тред от какого-либо другого, его обработку всё ещё необходимо снабдить проверкой флага.
👉@BookJava
🔥 Пройди тест по Java и проверь свои знания.
Ответишь — пройдешь на продвинутый курс "Java Developer. Professional" от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса🎁 .
🌲 А ещё, сейчас действуют новогодние скидки! Возможна оплата в рассрочку! Предложение ограничено.
👉 ПРОЙТИ ТЕСТ: https://vk.cc/cteT1KРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Finding CPU Load with JFR. JDK Flight Recorder, в быту JFR
Среда наблюдения и мониторинга, встроенная в JDK! Начиная с JDK 11, JFR стал open-source и переименован в JDK Flight Recorder. Это делает JFR отличным выбором для отслеживания скрытых проблем, связанных с тем, почему приложение потребляет ресурсы, такие как CPU. В статье — о том, как работать с JFR.
https://inside.java/2023/11/27/sip090/
👉@BookJava
Совет 💡
Установка @Column в updateable=false
приводит к тому, что реализация JPA будет игнорировать этот столбец при выполнении оператора обновления. При этом не будет выброшено исключение. Это никак не влияет на базу данных. Вы по-прежнему можете обновлять столбец вне Hibernate.
👉@BookJava
#вакансия #удалённо #parttime #koltin #преподаватель
Время делиться знаниями!
OTUS – образовательная платформа. У нас авторские курсы разной степени сложности, вступительное тестирование для студентов и преподаватели-практики из крупнейших компаний. 6 лет мы учимся друг у друга, советуемся, помогаем, делимся опытом и обсуждаем новости как в преподавании, так и в IT.
Вакансия: преподаватель на кастомный онлайн курс - "Kotlin backend"
Можно без опыта преподавания, мы поможем вам освоить практики преподавания
Преподаватель раскрывает тему с помощью теории и примеров из практики.
Занятия в zoom в дневное время. Можно выбрать удобную нагрузку и темы занятий.
С нами вы сможете ✅
-получать за проведение 1 вебинара - 10.000 рублей + за проверку 1 дз - 500 рублей
- структурировать свой опыт и знания;
- прокачать софт-скиллы;
Бонусы 🎁
- наши курсы со скидкой/бесплатно;
- можно приглашать лучших выпускников к себе на работу;
- воркшопы и конференции для наших преподавателей.
Обсудить подробнее @HR_Nikita
@ TransactionalEventListener
Используйте @TransactionalEventListener
для выполнения определенной логики после успешной фиксации транзакции.
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/event/TransactionalEventListener.html
👉@BookJava
Команда Поиска и рекламных технологий Яндекса приглашает на митап для senior бэкенд-разработчиков в Екатеринбурге.
Поговорим про разработку, поиграем в квиз, понетворкаемся и просто хорошо проведем время.
12 декабря, 18:00.
Регистрируйтесь, количество мест в офлайне ограничено!
👩💻 Набор в последнюю группу курса "Java Developer. Professional" в уходящем 2023 году!
🎉 В Otus праздничные цены для отличной карьеры в IT!
Пройди тест по Java и проверь свои знания.
Ответишь — пройдешь на продвинутый курс "Java Developer. Professional" от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса .
🎄 Новогодние скидки! Возможна оплата в рассрочку! Предложение ограничено.
➡️ ПРОЙТИ ТЕСТ: https://vk.cc/ctypekРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Как использовать JavaEE сервлет в Spring Framework?
Web-приложение на Spring MVC технически само по себе работает на сервлетах: всю обработку запросов берет на себя единый DispatcherServlet
. С его помощью реализуется паттерн Front Controller.
Если вам нужно определить в программе полностью независимый от Spring-контекста сервлет или фильтр, ничего особенного для этого делать не нужно. Как обычно в Servlet API, нужно объявить класс, добавить его в web.xml как сервлет, добавить для сервлета маппинг.
Сервлет живет вне Spring-контекста, внедрение зависимостей в нём просто так не заработает. Чтобы использовать autowiring, на этапе инициализации сервлета вызывается статический SpringBeanAutowiringSupport.processInjectionBasedOnServletContext
, с текущим сервлетом и его контекстом в аргументах. В этом же утилитарном классе есть ряд других средств для работы с контекстом извне.
Если программа построена на Spring Boot, создание бина типа ServletRegistrationBean
поможет добавить сервлеты в рантайме. А для декларативного добавления на этапе компиляции, к классу конфигурации применяется @ServletComponentScan
. С этой аннотацией стартер приложения просканирует и добавит в контекст все web-компоненты в стиле Servlet 3.0: классы с аннотациями @WebFilter
, @WebListener
и @WebServlet
.
👉@BookJava
Как передать runtime информацию о generic-типе?
Когда вы проектируете API-метод библиотеки, иногда логика его реализации может зависеть от указанного клиентом типа. Особенно часто с этой задачей встречаются при разработке парсеров. Например, библиотека Jackson превращает JSON в объект заданного класса. На интервью этот вопрос можно встретить в виде практической задачи.
Первое, что приходит в голову для решения – дженерик-параметр. Такой подход не сработает, потому что тип будет стёрт во время компиляции, а логика будет происходить позже, во время выполнения.
Решение, которое сработает для многих случаев – объявление в методе аргумента типа Class<T>
. Пользователь будет передавать в него значение Foo.class
или fooInstance.getClass()
. Проблемы с ним начинаются, когда становится нужно передать generic-тип. Синтаксис .class
не поддерживает дженерики, а .getClass()
от экземпляров List<String>
и List<Integer>
вернет один и тот же объект-описание сырого типа List.
На помощь приходит техника, описанная в предыдущей публикации.
1. Объявляется generic класс-обертка над типом: TypeInformation<T>
;. Наш метод будет принимать информацию о типе в виде экземпляра этой обертки.
2. В обертку добавляется конструктор с видимостью protected. Теперь можно создавать объекты только наследников, но не самого этого типа.
3. Пользователь будет передавать экземпляр анонимного наследника обертки: new TypeInformation<List<String>>() {}
.
4. Внутри вызов getClass().getGenericSuperclass()
вернет ParameterizedType
. Это будет описание типа родителя анонима, то есть самой обертки. Из него с помощью getActualTypeArguments()
можно достать рантайм-информацию о значении дженерика (о List<String>).
👉@BookJava
♨️ Хочешь выйти на новый профессиональный уровень джавист?
- Осваивай Spring!
Тест на знание языка Java
— Ответь на 21 вопрос и проверь, насколько хорошо nы знаешь язык Java и готовы освоить Spring. Сможешь сдать — пройдёшь на продвинутый онлайн-курс "Разработчик на Spring" Framework со скидкой!
👉 ПРОЙТИ ТЕСТ ОНЛАЙН-КУРСА "Разработчик на Spring Framework": https://vk.cc/ctosfe
🎫 Курс доступен для приобретения в рассрочку!
🌲 А ещё, сейчас действуют новогодние скидки! Предложение ограничено.Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Beginning Java Objects: From Concepts to Code, 3rd Edition
Автор: Jacquie Barker (2023)
Среди многих привлекательных особенностей Java как языка программирования, его объектно-ориентированная природа является ключом к созданию мощного, многократно используемого кода и приложений, которые легко поддерживать и расширять. Чтобы воспользоваться этими возможностями, вам потребуется не только освоить синтаксис языка Java, но и получить практическое понимание того, что такое объекты, и, что еще важнее, как с нуля структурировать Java-приложение, чтобы максимально использовать объекты.
Скачать
👉 @java_360
Совет 💡
Самый простой способ сделать проверку нескольких полей без дополнительных классов и аннотаций - использовать @AssertTrue
. Вы помещаете его над методом, возвращающим булеву величину. Имя метода должно начинаться с "is
".
👉@BookJava
Подборка Telegram каналов для программистов
Системное администрирование 📌
/channel/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
/channel/sysadminof Книги для админов, полезные материалы
/channel/i_odmin Все для системного администратора
/channel/i_odmin_book Библиотека Системного Администратора
/channel/i_odmin_chat Чат системных администраторов
/channel/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
/channel/sysadminoff Новости Линукс Linux
/channel/tikon_1 Новости высоких технологий, науки и техники💡
/channel/mir_teh Мир технологий (Technology World)
/channel/rust_lib Полезный контент по программированию на Rust
/channel/golang_lib Библиотека Go (Golang) разработчика
/channel/itmozg Программисты, дизайнеры, новости из мира IT.
/channel/phis_mat Обучающие видео, книги по Физике и Математике
/channel/php_lib Библиотека PHP программиста 👨🏼💻👩💻
/channel/nodejs_lib Подборки по Node js и все что с ним связано
/channel/ruby_lib Библиотека Ruby программиста
1C разработка 📌
/channel/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
/channel/cpp_lib Библиотека C/C++ разработчика
/channel/cpp_knigi Книги для программистов C/C++
/channel/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
/channel/pythonofff Python академия. Учи Python быстро и легко🐍
/channel/BookPython Библиотека Python разработчика
/channel/python_real Python подборки на русском и английском
/channel/python_360 Книги по Python Rus
Java разработка 📌
/channel/BookJava Библиотека Java разработчика
/channel/java_360 Книги по Java Rus
/channel/java_geek Учим Java на примерах
GitHub Сообщество 📌
/channel/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
/channel/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
/channel/developer_mobila Мобильная разработка
/channel/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
/channel/frontend_1 Подборки для frontend разработчиков
/channel/frontend_sovet Frontend советы, примеры и практика!
/channel/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
/channel/game_devv Все о разработке игр
Вакансии 📌
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
Чат программистов📌
/channel/developers_ru
Библиотеки 📌
/channel/book_for_dev Книги для программистов Rus
/channel/programmist_of Книги по программированию
/channel/proglb Библиотека программиста
/channel/bfbook Книги для программистов
/channel/books_reserv Книги для программистов
БигДата, машинное обучение 📌
/channel/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
/channel/bookflow Лекции, видеоуроки, доклады с IT конференций
/channel/coddy_academy Полезные советы по программированию
QA, тестирование 📌
/channel/testlab_qa Библиотека тестировщика
Шутки программистов 📌
/channel/itumor Шутки программистов
Защита, взлом, безопасность 📌
/channel/thehaking Канал о кибербезопасности
/channel/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
/channel/ux_web Статьи, книги для дизайнеров
Английский 📌
/channel/UchuEnglish Английский с нуля
Математика 📌
/channel/Pomatematike Канал по математике
Excel лайфхак📌
/channel/Excel_lifehack
🦾 Освойте востребованный фреймворк всего за 5 месяцев и создавайте приложения на Java
🔥🔝 Знание Spring Framework – один из самых востребованных скиллов для разработчика, многие крупные проекты ищут именно таких специалистов на самые желанные офферы.
5️⃣ Вместе с OTUS вы можете освоить Spring всего за 5 месяцев в рамках курса «Разработчик на Spring Framework»!
❌❌Что даст вам этот курс:
✔️ Умение эффективно работать в проектах, где есть Spring
✔️ Знание современных возможностей Spring
✔️ Понимание, как создавать Web-приложения на микросервисной архитектуре и решать высокоуровневые задачи по разработке
✔️ Умение быстро проходить путь от идеи до production-grade
✔️ Владение фреймворками Spring и технологиями вспомогательных проектов (Spring MVC, Spring Security, Spring Boot, Spring Reactive Stack, Spring 5)
🌲 А ещё, сейчас действуют новогодние скидки! Предложение ограничено.
🎫 Курс доступен для приобретения в рассрочку!
Пройдите бесплатное вступительное тестирование прямо сейчас и узнайте, готовы ли вы стать студентом!
➡️ ПРОЙТИ ТЕСТ: https://vk.cc/ctgKrWРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🚀 Совет по Spring 🚀
Протоколирование HTTP-запросов с помощью фильтра CommonsRequestLoggingFilter
Включите протоколирование запросов с помощью фильтра CommonsRequestLoggingFilter
, чтобы получать подробную информацию о входящих запросах.
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/filter/CommonsRequestLoggingFilter.html
👉@BookJava
Какой выбрать тип для даты/времени?
В пакете java.util расположены старые классы стандартной библиотеки Java: Date (дата+время), Calendar (конвертация и манипуляция), TimeZone (смещение часового пояса). Эти классы обладали рядом известных проблем. Экземпляры были изменяемыми, что делало их потоко-небезопасными. Работа с датами через календарь была неудобной, не было нормальной поддержки часовых поясов и интернационализации.
Постепенно стандартом де-факто стала сторонняя библиотека Joda-Time. Её разработчики решили все названные выше проблемы.
В Java 8 был добавлен пакет java.time, который взял решения из Joda-Time в стандарт, создатель библиотеки участвовал в разработке. Ключевые классы пакета:
• LocalDate, LocalTime и LocalDateTime – локальные для пользователя дата/время.
• ZonedDateTime – дата/время в определенной часовой зоне.
• Period и Duration – периоды дат и времени соответственно.
Отдельно существуют классы Date и Time пакета java.sql. Это представление даты и времени для обмена данными через JDBC. Не стоит пользоваться ими вне уровня доступа к данным, хотя бы потому, что это классы-наследники старого java.util.Date.
Таким образом, в проектах на Java 8+ нужно использовать современные java.time.*, для более старых – подключать Joda-Time.
👉@BookJava
🌲Создайте интерактивную новогоднюю открытку на Java с нуля!
😳 Удивите близких, а заодно прокачайтесь в разработке на бесплатном практическом уроке от OTUS и Александра Фисунова – Senior Kotlin Developer в SSP Software на проекте ВТБ.
В результате урока вы:
✔️ Увидите, как пишется код и создаются программы на Java
✔️ Сможете повторить все шаги и делать подобные открытки на любую тематику
📢📢 Занятие пройдёт 20 декабря в 20:00 мск и будет приурочено к старту курса «Специализация Java-разработчик». На нем вы сможете освоить профессию с нуля до уверенного Middle.
👉 Для бесплатного участия и получения записи урока регистрируйтесь прямо сейчас: https://vk.cc/cta36kРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Из каких основных сущностей состоит Spring-приложение?
Bean – объект бизнес-логики в терминологии Spring Framework.
BeanDefinition – описание того, как создавать бин. Объект хранит его тип, метаинформацию, набор параметров для конструктора.
BeanFactory – главная точка входа в DI-контейнер. Хранит BeanDefinition-ы, умеет создавать по ним экземпляры бинов, или выдавать существующие, в зависимости от скоупа.
BeanPostProcessor – донастраивает только что созданные бины, перед тем как положить их в контейнер. Его методы уже упоминались в публикации про жизненный цикл. Типичное место, чтобы оборачивать бины в прокси. Также с помощью такого пост-процессора внедряются @Autowired
-зависимости. Пост-процессоры бинов живут внутри экземпляра BeanFactory.
BeanFactoryPostProcessor – тоже пост-обработчик, но для определений бинов (BeanDefinition). Обычно используется для модификации параметров или класса, из которых будут строиться бины.
Для создания определений бинов в основном применяются классы и интерфейсы *BeanDefinitionReader. Некоторые из них вызываются прямо из контекста приложения, другие реализуют BeanFactoryPostProcessor. Один такой пост-процессор, например, отвечает за добавление определений бинов по аннотациям @Component
и @Configuration
.
Реализация интерфейса ApplicationContext – основное хранилище конфигурации Spring-приложения (или его части). Контекст неизменяем, но может быть целиком перезагружен. Xml-файл конфигурации на старте приложения превращается в объект *XmlApplicationContext. Для конфигурации на аннотациях создастся AnnotationConfigApplicationContext. Контекст выполняет четыре разных обязанности:
1. DI-контейнер. ApplicationContext функционирует как специальная реализация BeanFactory. Он также производит и хранит бины, но, в отличие от обычных фабрик, контексты в приложении составляют иерархию. Определения бинов из дочерних контекстов перекрывают родительские.
2. Загрузка ресурсов. Под интерфейсом ResourceLoader контекст занимается загрузкой в память приложения файлов, как из classpath, так и из остальной файловой системы.
3. Публикация событий приложения. Контекст распространяет в приложении «события» – наследники ApplicationEvent. Любой бин, которому нужно получать уведомления об этих событиях, просто реализует интерфейс ApplicationListener. Таким образом реализуется паттерн наблюдатель.
4. Интернационализация. По коду, набору аргументов и локали, через интерфейс контекста MessageSource можно получать локализованные текстовые сообщения для пользователей.
👉@BookJava
В каких случаях разумно использовать массив, а не ArrayList?
Использование обычных массивов вместо ArrayList
имеет смысл в следующих ситуациях:
— Нужен предсказуемый и строгий контроль размера массива. Массивы имеют фиксированный размер, в отличие от ArrayList
.
— Требуется максимальная производительность при работе с примитивными типами данных (int, double и т. д.). Доступ к элементам массива быстрее, чем в ArrayList.
— Нужно создать структуру данных, которая должна быть неизменяемой.
— Требуется тесная интеграция с существующим кодом на основе обычных массивов. Переход на ArrayList
может потребовать значительный рефакторинг.
— Не нужны динамические функции ArrayList
, такие как автоматическое изменение размера, методы вставки/удаления и т. д.
— Ограничения на использование дополнительной памяти. Массивы компактнее ArrayList
за счет фиксированного размера.
👉@BookJava
Старт подготовительного курса по Java-разработке.
⏰ Когда: уже 12 декабря.
Даем: 62 урока с практикой в браузере, 3 онлайн вебинара и 1 сессию лайвкодинга с практикующим разработчиком.
Получаем: крепкие знания базы языка, умение понимать код и первую программу на Java, написанную вместе с наставником.
Всего 990 ₽ и ваше жгучее желание начать. Приходите с любым бэкграундом: нам не важны возраст, пол, образование и текущая профессия.
Запишитесь прямо сейчас!
Реклама. АНПОО "ХЕКСЛЕТ КОЛЛЕДЖ". ИНН 7839056670.
Немного о гигиене Java кода
Во время код-ревью или работы над новым проектом может раздражать многое: стиль, подходы, качество. Но больше всего расстраивает банальный недостаток гигиены кода. В связи с регулярностью проблемы хочется на неё обратить внимание и напомнить, как гигиену поддерживать.
Разумеется, все мы люди, живущие в несовершенном мире. Поэтому последнее, что мне хочется, это журить и так стеснённых обстоятельствами программистов. Тем более не хочется почём зря ругать разработчиков Open Source проектов. Но сейчас я предлагаю побыть перфекционистами и вспомнить все те случаи, когда с подобным кодом приходилось иметь дело вам.
https://habr.com/ru/companies/pvs-studio/articles/779300/
👉@BookJava