Библиотека Java разработчика
11.2K subscribers
852 photos
400 videos
302 files
1.23K links
Библиотека Java разработчика. Java, Spring, Maven, Hibernate


По всем вопросам @evgenycarter
Download Telegram
Как нельзя называть переменные?

Этот вопрос подразумевает ответ из двух частей. Нужно указать, какие есть технические ограничения, и какие стилистические. Стиль – слишком большая тема, не специфичная только для Java, не будем на ней останавливаться.

Технически компилятор налагает одинаковые ограничения на имена как переменных, так и классов, методов, и всего остального. Эти имена обобщенно называются идентификаторы.

Ограничений всего три:
1. Имя целиком не должно совпадать с зарезервированным словом;
2. Первый символ должен проходить проверку методом Character.isJavaIdentifierStart();
3. Остальные символы должны проходить проверку Character.isJavaIdentifierPart().

На практике проверки означают, что имя должно состоять из таких символов Unicode, как:
• Буквы (разных языков)
• Символы валют (такие как $)
• Соединительные символы (такие как _)
Диакритика (combining mark, non-spacing mark)
• Методы, проходящие Character.isIdentifierIgnorable() (непечатаемые символы, в идентификаторе игнорируются компилятором)
• Цифры, числовые символы (такие как римские числа)

Последний пункт недопустим для первого символа имени. Тип конкретного символа можно узнать методом Character.getType().

Интересно зарезервированное слово var. Оно стоит особняком от других ключевых слов, потому что является зарезервированным только в контексте типа. Использовать var в качестве имени переменной можно.

👉@BookJava
Media is too big
VIEW IN TELEGRAM
JavaOne 2022

The Future of Java is You | JavaOne 2022 Community Keynote
Inside Java | JavaOne 2022 Technical Keynote
Java First. Java Always.
Matt Raible on Micro Frontends for Java Developers
Josh Long on Fast, Scalable, Cloud Native Services in Java
Building Cloud Native Applications with Rustam Mehmandarov
Emily Jiang Rethinks Microservices and Builds Cloud Native Apps
Delightful Integration Testing with Oleg Šelajev
The Lost Art of Debugging with Mark Heckler
Bruno Souza on Building your Java Career
Streamlining Large-Scale Java Development with Sander Mak
String Templates, JavaFX 19, Deserialization, and more at JavaOne - Inside Java Newscast #32
Sequenced Collections, Purity, and more at JavaOne - Inside Java Newscast #31
Paul Sandoz on community at JavaOne at Oracle CloudWorld
GraalVM in OpenJDK and more JavaOne Announcements - Inside Java Newscast #36

Все видео доступны на youtube

👉@BookJava
Media is too big
VIEW IN TELEGRAM
Что надо знать о логировании прагматичному Java-программисту

👉@BookJava
Как отладить удаленное приложение?

Если приложение работает не в продакшне, его паузы допустимы, а у потенциального злоумышленника нет сетевого доступа к хосту, стандартный способ отладки – непосредственно remote debug. Для этого приложение запускается с включенным протоколом удаленной отладки JDWP. Приложение принимает на указанный порт подключения отладчика. Это может быть отдельная утилита jdb, или встроенная в IDE.

В JDK поставляется набор инструментов для мониторинга. Например Java Mission Control и JConsole позволяют подключиться к приложению и посмотреть множество показателей его здоровья. Полный список инструментов специфичен для конкретной JVM, для HotSpot можно посмотреть в документации.

Вне зависимости от обстоятельств, всегда необходимо заранее позаботиться о диагностической информации номер один – логах. Как минимум, ни один встроенный инструмент не покажет вам информацию о событиях, определяемых бизнес-логикой вашего приложения. Логироваться должен необходимый минимум, который позволит при любом инциденте понять, что произошло.

В стандартную поставку Java включен пакет для логгирования java.util.logging, позже остановимся на нём подробнее. Также существует ряд популярных библиотек: Log4j, SLF4J, Logback. Про техники и сложности логгирования современного энтерпрайза есть неплохой доклад.

👉@BookJava
Java Collections Framework. Вопросы для собеседования.

https://github.com/enhorse/java-interview/blob/master/jcf.md

👉@BookJava
Media is too big
VIEW IN TELEGRAM
Java Virtual Threads

0:00 Intro
0:42 What are preview features, and how you can use them
3:34 What are Virtual Threads about?
4:21 Goals of Virtual Threads
5:11 Cost of a platform thread and CPU usage
7:49 How to use Virtual Threads
9:11 Using ExecutorServices with Virtual Threads
11:04 ThreadLocals and Synchronization
11:19 Synchronization, pinned threads and locks
13:14 Final words and outro

👉@BookJava
Сервер авторизации для микросервисов на Spring Boot

Что такое JWT-токен и зачем его использовать?

JSON Web Token (JWT) — это стандарт передачи информации с полезной нагрузкой в формате JSON в виде некоторого количества утверждений (claim) с опциональной подписью и/или шифрованием.

JWT-токены содержат сведения для аутентификации и могут использоваться в нескольких сервисах, инстансах для реализации stateless-аутентификации (без сохранения состояния). При использовании JWT-токенов нет необходимости содержать отдельные ресурсы для пользовательских сессий или хранить токены/сессии в отдельной базе данных/кэше. Далее

👉@BookJava
Что такое busy spin?

busy spin – это техника, которую программисты используют, чтобы заставить поток ожидать при определённом условии. В отличие от традиционных методов wait(), sleep() или yield(), которые подразумевают уступку процессорного времени, этот метод вместо уступки выполняет пустой цикл. Это необходимо для того, чтобы сохранить кэш процессора, т.к. в многоядерных системах существует вероятность, что приостановленный поток продолжит своё выполнение уже на другом ядре, а это повлечет за собой перестройку состояния процессорного кэша, которая является достаточно затратной процедурой.

👉@BookJava
В чём заключается разница между IO и NIO?

• Java IO (input-output) является потокоориентированным, а Java NIO (new/non-blocking io) – буфер-ориентированным. Потокоориентированный ввод/вывод подразумевает чтение/запись из потока/в поток одного или нескольких байт в единицу времени поочередно. Данная информация нигде не кэшируются. Таким образом, невозможно произвольно двигаться по потоку данных вперед или назад. В Java NIO данные сначала считываются в буфер, что дает больше гибкости при обработке данных.
• Потоки ввода/вывода в Java IO являются блокирующими. Это значит, что когда в потоке выполнения вызывается read() или write() метод любого класса из пакета java.io.*, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого. Неблокирующий режим Java NIO позволяет запрашивать считанные данные из канала (channel) и получать только то, что доступно на данный момент, или вообще ничего, если доступных данных пока нет. Вместо того, чтобы оставаться заблокированным пока данные не станут доступными для считывания, поток выполнения может заняться чем-то другим. Тоже самое справедливо и для неблокирующего вывода. Поток выполнения может запросить запись в канал некоторых данных, но не дожидаться при этом пока они не будут полностью записаны.
• В Java NIO имеются селекторы, которые позволяют одному потоку выполнения мониторить несколько каналов ввода. Т.е. существует возможность зарегистрировать несколько каналов с селектором, а потом использовать один поток выполнения для обслуживания каналов, имеющих доступные для обработки данные, или для выбора каналов, готовых для записи.

👉@BookJava
Расскажите про приведение типов. Что такое понижение и повышение типа?

Java является строго типизированным языком программирования, а это означает, то что каждое выражение и каждая переменная имеет строго определенный тип уже на момент компиляции. Однако определен механизм приведения типов (casting) - способ преобразования значения переменной одного типа в значение другого типа.

В Java существуют несколько разновидностей приведения:

• Тождественное (identity). Преобразование выражения любого типа к точно такому же типу всегда допустимо и происходит автоматически.
• Расширение (повышение, upcasting) примитивного типа (widening primitive). Означает, что осуществляется переход от менее емкого типа к более ёмкому. Например, от типа byte (длина 1 байт) к типу int (длина 4 байта). Такие преобразование безопасны в том смысле, что новый тип всегда гарантировано вмещает в себя все данные, которые хранились в старом типе и таким образом не происходит потери данных. Этот тип приведения всегда допустим и происходит автоматически.
• Сужение (понижение, downcasting) примитивного типа (narrowing primitive). Означает, что переход осуществляется от более емкого типа к менее емкому. При таком преобразовании есть риск потерять данные. Например, если число типа int было больше 127, то при приведении его к byte значения битов старше восьмого будут потеряны. В Java такое преобразование должно совершаться явным образом, при этом все старшие биты, не умещающиеся в новом типе, просто отбрасываются - никакого округления или других действий для получения более корректного результата не производится.
• Расширение объектного типа (widening reference). Означает неявное восходящее приведение типов или переход от более конкретного типа к менее конкретному, т.е. переход от потомка к предку. Разрешено всегда и происходит автоматически.
• Сужение объектного типа (narrowing reference). Означает нисходящее приведение, то есть приведение от предка к потомку (подтипу). Возможно только если исходная переменная является подтипом приводимого типа. При несоответствии типов в момент выполнения выбрасывается исключение ClassCastException. Требует явного указания типа.
• Преобразование к строке (to String). Любой тип может быть приведен к строке, т.е. к экземпляру класса String.
• Запрещенные преобразования (forbidden). Не все приведения между произвольными типами допустимы. Например, к запрещенным преобразованиям относятся приведения от любого ссылочного типа к примитивному и наоборот (кроме преобразования к строке). Кроме того, невозможно привести друг к другу классы, находящиеся на разных ветвях дерева наследования и т.п.

При приведении ссылочных типов с самим объектом ничего не происходит - меняется лишь тип ссылки, через которую происходит обращение к объекту.

Для проверки возможности приведения нужно воспользоваться оператором instanceof:

Parent parent = new Child();
if (parent instanceof Child) {
Child child = (Child) parent;
}


👉@BookJava
Где у Java приложения точка входа?

В обычном Java приложении всегда должен быть main class, содержащий метод main. С него начинается исполнение всей программы. Main class-ом может быть не только класс, но и интерфейс или енам. Для JavaFX приложения главный класс должен реализовывать javafx.application.Application.

main обязательно public static. Дополнительно, методу разрешено иметь модификатор strictfp. На аннотации и список исключений ограничений не накладывается.

В главном методе должен быть объявлен единственный аргумент – массив строк. Обе конструкции String[] и String... компилируются в один и тот же байт-код, так что приемлемы оба варианта. Название массива может быть любым, а значение будет содержать аргументы командной строки.

Когда приложение запускается как classpath, главный класс передается параметром командной строки. Если выполняется единственный исходник, он и описывает main class.

Для исполняемого jar-файла (java -jar MyJar.jar), его главный класс должен быть указан в манифесте. Внутри архива, в файл META-INF/MANIFEST.MF добавляется строчка вида Main-Class: ru.google.com.MyClass. Иначе запуск завершается ошибкой «no main manifest attribute».

В случае, когда в указанном главном классе не оказывается метода, который бы удовлетворял всем критериям главного метода, программа падает с ошибкой «Main method not found».

В апплетах вместо main входной точкой служат методы init и start. Начиная с версии Java 9 технология апплетов объявлена устаревшей, а с 11 – совсем удалена. Не будем останавливаться на них подробнее.

👉@BookJava
Java. Сортировки

Java. Сортировка пузырьком.
Java. О сортировке выбором.
Java. Быстрая сортировка. Объяснение на пальцах)
Java. Оценка сложности алгоритмов сортировки.
Java. Сортировка слиянием.
Java. Сортировка подсчетом.
Java. Сортировка вставками.
Java. Сортировка расческой. От пузырька до расчески.

👉@BookJava
Бонни и Клайд, зима и Новый год, черное и белое, в конце концов, сметана и пельмени - есть вещи, которые прекрасно сочетаются и дополняют друг друга. Можно сказать, неотделимые друг от друга. В случае с Java-разработчиком это Spring Framework.

Мы, конечно, шутим, но если говорить серьезно, то без уверенного знания этого фреймворка сложно рассчитывать на действительно крутые проекты и серьезные задачи. Почему? Потому что более 90% вакансий Java-разработчика требуют знания Spring Framework. А еще потому что Spring Framework — де-факто стандарт разработки промышленных приложений для языка Java. Кажется, этого уже должно быть достаточно, чтобы изучить самый популярный фреймворк для Java. Но почему-то, нередко junior и middle разработчики пренебрегают этим знанием. Во многих онлайн школах на курсах либо комплексное и долгое обучение Java-разработке с нуля, где лишь поверхностно изучается Spring, либо отдельные курсы по Spring, но на английском языке. Короче, долго или сложно для изучения.

Мы в Слёрме не понаслышке знаем и регулярно видим, как часто разработчики просто машинально используют Spring, даже не вникая в его возможности. Все бы ничего, но когда возникает проблема или не шаблонная задача, они не понимают, куда смотреть и что делать. А что делать? Изучать разные сценарии использования Spring Framework, желательно на практике. А пока ловите экспертное мнение о плюсах и минусах самого популярного Java-фреймворка:

https://habr.com/ru/company/southbridge/blog/698780/