Пишем свой сайт
Если вам вдруг захотелось написать свой сайт, так ещё и на Java, без всяких велосипедов и кучи библиотек, то вам поможет grails.
Этот фреймворк основан на Spring Boot, использует упрощённый язык Groovy и даже позволяет запускать React и Angular.
📌 Документация
#java #lesson #web
Если вам вдруг захотелось написать свой сайт, так ещё и на Java, без всяких велосипедов и кучи библиотек, то вам поможет grails.
Этот фреймворк основан на Spring Boot, использует упрощённый язык Groovy и даже позволяет запускать React и Angular.
📌 Документация
#java #lesson #web
☕️ Тестируем Java
Протестированный код лучше, чем код с кучей багов. Чтобы ручками не проверять его работоспособность, пишут автоматические тесты.
JUnit — одна из самых популярных библиотек для проверки кода на Java. Она позволит вам за пару минут проверить функционал.
📖 Документация
#java #lesson #testing
Протестированный код лучше, чем код с кучей багов. Чтобы ручками не проверять его работоспособность, пишут автоматические тесты.
JUnit — одна из самых популярных библиотек для проверки кода на Java. Она позволит вам за пару минут проверить функционал.
📖 Документация
#java #lesson #testing
Log4j 2
Каким бы ни было ваше приложение, всё равно стоит вести логи, иначе вы не поймёте, кто или что сломало ваш проект на продакшене.
Библиотек очень много (Log4j, Log5j, Log4j 2, Logback, SLF4J), но лучшей библиотекой для логирования сейчас является Log4j 2.
📖 Документация
#java #lesson #logging
Каким бы ни было ваше приложение, всё равно стоит вести логи, иначе вы не поймёте, кто или что сломало ваш проект на продакшене.
Библиотек очень много (Log4j, Log5j, Log4j 2, Logback, SLF4J), но лучшей библиотекой для логирования сейчас является Log4j 2.
📖 Документация
#java #lesson #logging
Регулярные выражения
java.util.regex позволяет с помощью специальных выражений находить нужные значения внутри текста.
Нам понадобятся только классы Matcher (для сохранения результатов сравнения) и Pattern (для создания выражения).
Если у вас есть какие-то ошибки в синтаксисе, то метод
#java #lesson #regex
java.util.regex позволяет с помощью специальных выражений находить нужные значения внутри текста.
Нам понадобятся только классы Matcher (для сохранения результатов сравнения) и Pattern (для создания выражения).
Если у вас есть какие-то ошибки в синтаксисе, то метод
compile()
выдаст PatternSyntaxException.#java #lesson #regex
public vs protected vs private
Это параметры доступа, они определяют, в каких условиях можно получить доступ к определённым функциям/переменным.
public — любой класс может получить доступ к этому методу, считать его и изменить.
protected — доступ к переменной могут получить только дети этого класса.
private — изменять и считывать значения можно только внутри класса, где она создана.
По умолчанию ко всем объектам применяется модификатор private.
#java #lesson #basics
Это параметры доступа, они определяют, в каких условиях можно получить доступ к определённым функциям/переменным.
public — любой класс может получить доступ к этому методу, считать его и изменить.
protected — доступ к переменной могут получить только дети этого класса.
private — изменять и считывать значения можно только внутри класса, где она создана.
По умолчанию ко всем объектам применяется модификатор private.
#java #lesson #basics
Паттерн Singleton
Класс существует только в едином экземпляре и к нему есть глобальный доступ (то есть, отовсюду).
Обратите внимание, что Singleton стоит использовать, если вам нужен только один экземпляр, а не когда вам нужен глобальный доступ к экземпляру.
Многие новички допускают ошибку, которую я описал выше, что превращает их код в кучу Singleton'ов. Решение: Dependency Injection.
#java #lesson #patterns
Класс существует только в едином экземпляре и к нему есть глобальный доступ (то есть, отовсюду).
Обратите внимание, что Singleton стоит использовать, если вам нужен только один экземпляр, а не когда вам нужен глобальный доступ к экземпляру.
Многие новички допускают ошибку, которую я описал выше, что превращает их код в кучу Singleton'ов. Решение: Dependency Injection.
#java #lesson #patterns
Dependency Injection
Особо актуально, если у вас больше 30 разных классов и вам нужно как-то одни передавать в другие. Перейдём к теории:
Концепция Dependency Injection состоит в том, чтобы перенести ответственность за создание экземпляра объекта из тела метода за пределы класса и передать уже созданный экземпляр объекта обратно.
То есть приложение само отвечает за «внедрение» экземпляров внутрь классов. Это делает код чище и упрощает работу.
📕 Google Guice tutorial
#java #lesson #di
Особо актуально, если у вас больше 30 разных классов и вам нужно как-то одни передавать в другие. Перейдём к теории:
Концепция Dependency Injection состоит в том, чтобы перенести ответственность за создание экземпляра объекта из тела метода за пределы класса и передать уже созданный экземпляр объекта обратно.
То есть приложение само отвечает за «внедрение» экземпляров внутрь классов. Это делает код чище и упрощает работу.
📕 Google Guice tutorial
#java #lesson #di
Тернарная операция
Если условие верно, задать "123", иначе — "321". Это пример условия, которое можно записать в одну строку.
Если
#java #lesson #theory
Если условие верно, задать "123", иначе — "321". Это пример условия, которое можно записать в одну строку.
var x = condition ? expression1 : expression2
— общий вид тернарного оператора.Если
condition
== true
, то задать x
значение expression1
, иначе — expression2
.#java #lesson #theory
Java Best Practices
Это то, что сделает вас хорошим программистом. Best Practices — набор правил, построенных на основе чужих ошибок, на основе чужой боли, чтобы их избежать.
Придерживаясь этих правил, вы сделаете свой код более читаемым и стабильным. Почитать про это вы можете в этом репозитории.
#java #usefull_link
Это то, что сделает вас хорошим программистом. Best Practices — набор правил, построенных на основе чужих ошибок, на основе чужой боли, чтобы их избежать.
Придерживаясь этих правил, вы сделаете свой код более читаемым и стабильным. Почитать про это вы можете в этом репозитории.
#java #usefull_link
commons-cli
Пользователь, запуская приложение, может передавать какие-либо данные через терминал. Все они сохраняются в аргументе args метода
Чтобы упросить парсинг этих самых аргументов, можно воспользоваться библиотекой commons-cli. Она, к тому же, не имеет зависимостей.
📕 Документация
#java #lesson #cli
Пользователь, запуская приложение, может передавать какие-либо данные через терминал. Все они сохраняются в аргументе args метода
main(String[] args)
.Чтобы упросить парсинг этих самых аргументов, можно воспользоваться библиотекой commons-cli. Она, к тому же, не имеет зависимостей.
📕 Документация
#java #lesson #cli
Roadmap по Java
Эта дорожная карта ответит на вопросы: «С чего мне начать?» и «Что учить дальше?» Пройдясь по этому пути вы сможете полностью освоить язык и назвать себя настоящим Java программистом.
#roadmap
Эта дорожная карта ответит на вопросы: «С чего мне начать?» и «Что учить дальше?» Пройдясь по этому пути вы сможете полностью освоить язык и назвать себя настоящим Java программистом.
#roadmap
Тип Optional
Если вы работает с коллекциями то, наверное, уже столкнулись с проблемой, когда метод
Вместо этого мы можем получить null, задать значение по умолчанию или выбросить другую ошибку.
#java #lesson #collections
Если вы работает с коллекциями то, наверное, уже столкнулись с проблемой, когда метод
stream().any()
может ничего не вернуть. Мы получаем ошибку, с которой неудобно работать.Вместо этого мы можем получить null, задать значение по умолчанию или выбросить другую ошибку.
#java #lesson #collections
Function<T, R> и Consumer<T>
Бывает такое, что нам нужно передать в метод какую-либо другую функцию. Чтобы не создавать кучу интерфейсов с одним методом, мы можем воспользоваться уже готовыми.
Мы вполне можем использовать эти интерфейсы с лямбдами. Подробнее про Function и Consumer.
#java #lesson #interface
Бывает такое, что нам нужно передать в метод какую-либо другую функцию. Чтобы не создавать кучу интерфейсов с одним методом, мы можем воспользоваться уже готовыми.
Function<T, R>
— принимает в себя значение с типом T, а возвращает с типом R.Consumer<T>
— принимает в себя значение с типом T, но ничего не возвращает.Мы вполне можем использовать эти интерфейсы с лямбдами. Подробнее про Function и Consumer.
#java #lesson #interface
Cloneable
При передаче объекта функции, мы, на самом деле, передаём ссылку на него. И все изменения с экземпляром, что происходят внутри функции, повлияют и на внешнюю переменную.
Чтобы избежать неожиданное изменение свойств, мы можем создать клон объекта и передать функции уже его. Для этого нужно, чтобы класс реализовывал интерфейс Cloneable.
📌 Документация
#java #lesson #objects
При передаче объекта функции, мы, на самом деле, передаём ссылку на него. И все изменения с экземпляром, что происходят внутри функции, повлияют и на внешнюю переменную.
Чтобы избежать неожиданное изменение свойств, мы можем создать клон объекта и передать функции уже его. Для этого нужно, чтобы класс реализовывал интерфейс Cloneable.
📌 Документация
#java #lesson #objects
Разделяй и властвуй
В разы приятнее, когда программа разделена на логические части: эта папка отвечает за кисти, эта за отрисовку изображения, эта за отправку запросов.
Код мы разделяем с помощью пакетов. Пакет (из документации) — это группа связанных типов, обеспечивающая защиту доступа и управление пространством имен.
Мы можем отделять части программы, ограничивать к ним доступ и/или переносить в другие приложения.
📌 Документация
#java #lesson #packages
В разы приятнее, когда программа разделена на логические части: эта папка отвечает за кисти, эта за отрисовку изображения, эта за отправку запросов.
Код мы разделяем с помощью пакетов. Пакет (из документации) — это группа связанных типов, обеспечивающая защиту доступа и управление пространством имен.
Мы можем отделять части программы, ограничивать к ним доступ и/или переносить в другие приложения.
📌 Документация
#java #lesson #packages