Изучаем Java. По вопросам сотрудничества: @seniorvladislav
Интерфейс Cloneable
Интерфейс Cloneable
используется для указания, что класс может быть клонирован. Он не содержит методов и служит только как маркер, указывающий на то, что класс поддерживает интерфейс Cloneable
.
Метод clone()
является защищенным методом класса Object
. Поэтому, чтобы использовать клонирование в своем классе, вы должны переопределить этот метод и сделать его публичным.
Важно отметить, что метод clone()
создает поверхностную копию объекта. Это означает, что если ваш объект содержит ссылки на другие объекты, то клонированный объект будет ссылаться на те же объекты, что и оригинал.
В этом примере мы создаем класс Student
, который реализует интерфейс Cloneable
и переопределяет метод clone()
. В методе main()
мы создаем объект original
и клонируем его в объект clone
. Затем мы меняем имя в клонированном объекте и видим, что имя в оригинальном объекте остается неизменным. Это демонстрирует, что клонирование создает новый, независимый объект.
❓Хотите создавать бэкенд Java-приложений с использованием Groovy? Тогда приходите 27 июня в 20:00 мск на открытый урок «Shared Libraries в Jenkins» в OTUS. На занятии мы посмотрим, как расширять пайплайны в Jenkins с помощью внешних библиотек и научимся их писать.
Встреча приурочена к запуску онлайн-курса «Groovy Developer» в OTUS.
⚡️Спикер: Андрей Поляков, старший разработчик в Unlimint и преподаватель курса.
На занятии мы рассмотрим:
- Подключение библиотек в пайплайнах
- Структуру shared-libraries
- Особенности подключения и глобальные настройки
- Возможности Groovy при написании shared-библиотек
🔥Вебинар будет полезен DevOps-инженерам и Java-разработчикам, которые хотят научиться создавать и настраивать сборки Java Backend проектов.
Для участия зарегистрируйтесь: https://otus.pw/t2gC/
Нативная интеграция. Информация о продукте www.otus.ru
Стать сотрудником Яндекса быстрее и проще, чем кажется. Участвуйте в днях быстрого найма: решите тестовое, пройдите несколько секций собеседования и получите офер за несколько дней.
Ближайшие мероприятия:
• 14 июня - 5 июля — Fast Track для бэкенд-разработчиков и SRE, офер за 2 дня в команды: Yandex Cloud, Yandex 360, Yandex Infrastructure.
• 15-16 июля — Fast Track для Java-разработчиков, офер за 2 дня в одну из команд Crowd.
Зарегистрироваться
Никакие платные курсы больше не нужны — по этим 4 каналам можно освоить Frontend-разработку с нуля 👇
📌Senior Frontend — JS, HTML и CSS
📌Frontend Interview — как проходить собеседования
📌Web Craft — только Web-разработка
📌Frontender Libs — библиотеки для фронтендеров
🔥 Переходите на новый уровень в JS-разработке и разнообразьте свою работу!
Пройди тест по JS и проверь как хорошо ты знаешь язык.
Ответишь — пройдешь на продвинутый курс «JavaScript Developer. Professional» от OTUS по специальной цене + получишь видео-курс по Git в подарок
👉 ПРОЙТИ ТЕСТИРОВАНИЕ
https://otus.pw/lbc0/Нативная интеграция. Информация о продукте www.otus.ru
WeakReferenceWeakReference
— это специальный тип ссылки, который не предотвращает сборку мусора на объект, на который она указывает. Это означает, что если объект имеет только слабые ссылки (и нет сильных ссылок на него), он может быть удален сборщиком мусора в любое время.WeakReference
часто используется для реализации кэширования или для связи между объектами, которые не должны предотвращать сборку мусора.
В этом примере мы создаем строку и сильную ссылку на нее, а затем создаем слабую ссылку на ту же строку. Затем мы удаляем сильную ссылку и вызываем сборщик мусора. После этого мы проверяем, существует ли еще слабая ссылка.
Это показывает, что после того, как сильная ссылка была удалена и сборщик мусора был вызван, слабая ссылка была очищена, и объект, на который она указывала, был удален.
JUnit.Assert
В JUnit
, класс Assert
предоставляет набор методов утверждений, которые полезны при написании тестовых случаев.
В отличие от ключевого слова assert
, которое используется для внутренних проверок в коде и может быть отключено при выполнении программы, методы класса Assert
в JUnit
всегда активны и используются специально для тестирования.
В этом примере мы имеем три тестовых случая:testAddition()
: проверяет, что результат сложения 2 и 3 равен 5.testObjectEquality()
: проверяет, что две строки "test" ссылаются на один и тот же объект.testCondition()
: проверяет, что условие "2 меньше 3" истинно.
Если все эти условия выполняются, то все тесты пройдут успешно. Если хотя бы одно из условий не выполняется, то соответствующий тест будет считаться неудачным.
Ключевое слово native
Ключевое слово native
используется для объявления метода, который реализован на другом языке программирования, обычно на C или C++.
Это позволяет программистам использовать код, написанный на других языках, и взаимодействовать с системными вызовами или библиотеками, которые недоступны непосредственно в Java.
Когда метод помечен как native
, он не может иметь тела и должен заканчиваться точкой с запятой. Спецификация Java Native Interface
(JNI) определяет правила и руководство по реализации нативных методов, таких как преобразование типов данных между Java и нативным приложением.
NavigableMapNavigableMap
является интерфейсом, который расширяет SortedMap
и предоставляет дополнительные методы для навигации по отсортированной коллекции.
Он может быть полезен, когда вам нужно работать с отсортированными данными и выполнять операции, такие как поиск ближайшего ключа, меньшего или большего заданного значения, или получение подмножества элементов на основе диапазона ключей.
В этом примере мы используем различные методы навигации, такие как lowerEntry
, floorEntry
, ceilingEntry
и higherEntry
, чтобы найти ближайшие ключи к заданному значению. В конце мы создаем подмножество элементов с помощью метода subMap
, указывая диапазон ключей.
#вопросы_с_собеседований
Почему нежелательно использовать Thread.stop()?Thread.stop()
считается нежелательным для использования, потому что он не является безопасным. Остановка потока приводит к разблокированию всех мониторов, которые он заблокировал. Если какие-либо объекты, ранее защищенные этими мониторами, находились в несогласованном состоянии, другие потоки могут видеть эти объекты в несогласованном состоянии. Такие объекты называются поврежденными. Когда потоки работают с поврежденными объектами, может возникнуть произвольное поведение.
Вместо использования Thread.stop()
рекомендуется использовать согласованный механизм, такой как interrupt
.
#вопросы_с_собеседований
Чем отличается Lambda от анонимного класса?
Хотя в некоторых случаях они и могут быть использованы взаимозаменяемо, Lambda-выражения и анонимные классы имеют различия.
Разберем основные из них:1.
Синтаксис: Lambda-выражения имеют более краткий и лаконичный синтаксис по сравнению с анонимными классами.2.
Область применения: Lambda-выражения могут быть использованы только для функциональных интерфейсов, в то время как анонимные классы могут быть использованы для любых интерфейсов и абстрактных классов.3.
Ключевое слово this
: В анонимных классах ключевое слово this
ссылается на сам анонимный класс, в то время как в lambda-выражениях this
ссылается на объемлющий.4.
Производительность: Lambda-выражения обычно имеют лучшую производительность по сравнению с анонимными классами, так как они компилируются в приватные методы и используют инструкцию invokedynamic
.
Ключевое слово this
Ключевое слово this
используется для ссылки на текущий объект внутри метода или конструктора.
В этом примере у нас есть класс Student
с приватной переменной name
. В конструкторе и методе setName
используется ключевое слово this
для разрешения конфликта имен между переменной экземпляра name
и аргументом name
.
Благодаря использованию this
, мы можем ясно указать, что имеем в виду переменную экземпляра класса, а не аргумент метода или конструктора.
Spring ORM
Spring ORM (Object-Relational Mapping) — это модуль Spring Framework, который предоставляет интеграцию с популярными ORM-фреймворками, такими как Hibernate, JPA и JDO. Spring ORM предоставляет удобные шаблоны и интеграцию с Spring Transaction Management для упрощения работы с базами данных.
В этом примере мы будем использовать Spring ORM с Hibernate и H2 in-memory базой данных для создания простого приложения, которое сохраняет и извлекает объекты из базы данных:
1. Добавляем зависимости в наш build.gradle
файл:
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'2. Создаем сущность
implementation 'com.h2database:h2'
Person
.PersonRepository
.PersonService
.ApplicationContext
ApplicationContext — это центральный интерфейс в Spring Framework для предоставления конфигурации приложения. Он управляет созданием и связыванием объектов (bean'ов) во время выполнения приложения. ApplicationContext
предоставляет функции, такие как управление жизненным циклом bean'ов, внедрение зависимостей.
В данном примере мы использовали Java-конфигурацию для создания настройки ApplicationContext
. Spring также поддерживает другие способы конфигурации, такие как XML-конфигурация и аннотации на основе компонентов.
Результатом работы этого кода будет вывод сообщения "Hello, World!".
Узнаем точную дату с помощью Java
Здесь мы сначала получаем текущую дату через метод LocalDate.now()
, затем вычитаем из нее заданное количество дней методом minusDays()
, получая дату в прошлом.
Затем создаем объект класса DateTimeFormatter
, который позволяет задать формат выводимой даты (в данном случае "dd.MM.yyyy"). И наконец, форматируем дату методом format()
и выводим результат на экран.
Интерфейс AutoCloseable
Интерфейс AutoCloseable
представляет объект, который удерживает свои ресурсы до тех пор, пока он не будет закрыт.
Метод close()
объекта, который реализует интерфейс AutoCloseable
, вызывается автоматически, когда ресурсы больше не нужны. Эти ресурсы - это объекты, которые должны быть закрыты, как только приложение прекращает их обработку, чтобы они могли быть собраны сборщиком мусора и освободить память.
Оператор try-with-resources
гарантирует, что все объявленные ресурсы будут закрыты в конце оператора.
В этом примере мы объявляем экземпляр класса BufferedReader
, чтобы прочитать файл "test.txt".
Как только мы закончим чтение файла, метод close()
для BufferedReader
вызывается автоматически, освобождая ресурсы, связанные с чтением файла.
Результатом работы этого кода будет вывод содержимого файла "test.txt" в консоль. Если файл не существует или произошла другая ошибка ввода-вывода, будет выведен соответствующий стек трассировки.
Интерфейс FunctionFunction
— это функциональный интерфейс, который представляет функцию, принимающую один аргумент и возвращающую результат. Он определен в пакете java.util.function
и предоставляет метод apply()
.
Он может быть использован в любом месте, где вам нужна функция, принимающая один аргумент и возвращающая результат. Это особенно полезно при работе с потоками и лямбда-выражениями в Java 8 и выше.
В этом примере мы создаем функцию half
, которая принимает целое число и возвращает его половину в виде числа с плавающей точкой. Затем мы применяем эту функцию к числу 10 и выводим результат.
Результатом выполнения этого кода будет 5.0.
#вопросы_с_собеседований
Что такое Atomic types и зачем они нужны?
Atomic типы — это классы, которые предоставляют методы для выполнения атомарных операций и используются в многопоточном программировании для обеспечения безопасности потоков без использования блоков synchronized
.
Атомарные операции — это операции, которые выполняются как единое целое и не могут быть прерваны. Это означает, что если поток начинает выполнять атомарную операцию, никакой другой поток не может видеть промежуточное состояние или изменять состояние, пока операция не будет завершена.
Atomic типы, такие как AtomicInteger
, AtomicLong
, AtomicBoolean
и т. д., предоставляют методы для выполнения атомарных операций, таких как get()
, set()
, getAndSet()
, compareAndSet()
и т. д.
Они полезны в многопоточном программировании, когда необходимо обеспечить целостность данных при одновременном доступе к общим данным из нескольких потоков. Использование Atomic типов может помочь избежать ошибок синхронизации и улучшить производительность по сравнению с использованием блоков synchronized
, так как они не требуют блокировки.
SoftReferenceSoftReference
— это класс, который предоставляет механизм для динамического управления памятью, позволяя вам хранить объекты в памяти, пока не потребуется дополнительная память. Объекты, на которые ссылаются SoftReference
, могут быть удалены сборщиком мусора при нехватке памяти. Это делает SoftReference
идеальным выбором для реализации кэшей, где управление памятью является важным фактором.
*Обратите внимание, что сборщик мусора не гарантирует, что он будет немедленно вызван или выполнен при вызове System.gc()
. Это просто предложение JVM выполнить сборку мусора, и JVM может проигнорировать это предложение в зависимости от своей реализации и текущего состояния.
#вопросы_с_собеседований
Расскажите о механизме работы autoboxing в Java.
Autoboxing — это процесс, при котором примитивные типы данных автоматически преобразуются в соответствующие объекты их обертывающих классов. Это было введено в Java 5 для упрощения работы с примитивными типами и их обертывающими классами.
Autoboxing и unboxing значительно упрощают работу с коллекциями и другими структурами данных, которые работают с объектами, а не с примитивными типами. Они позволяют нам писать более чистый и более понятный код, не беспокоясь о преобразовании между примитивными типами и объектами.
List<Integer> list = new ArrayList<>();Например, в этом случае число 10 — это примитивный тип
list.add(10);
int
. Однако метод add()
ArrayList
ожидает объект Integer
. Здесь происходит autoboxing: Java автоматически преобразует примитивный тип int
в объект Integer
перед добавлением его в список.
Читать полностью…
Освойте базовые инструменты и возможности Java на бесплатном онлайн-интенсиве с 22 по 24 июня в 19:00 по московскому времени. На практических занятиях вы изучите синтаксис языка и попробуете написать Telegram-бота на Java.
Подробная программа и регистрация: 👉https://goo.su/Nc9u6c
📌Java в своих продуктах используют Twitter, Spotify, Netflix и другие сервисы. Игры Minecraft и Assassin’s Creed тоже написаны на Java. Согласно исследованиям, разработчики из России высоко ценятся на международных рынках.
☝️Никакой скучной теории — только самый интересный материал и мощная практика. За 3 дня вы примерите на себя профессию Java-разработчика и поймёте, в каком направлении двигаться дальше.
🎁 Всех ждут подарки. Участвуйте, задавайте вопросы и получите сертификат на скидку 10 000 рублей на любой курс Skillbox.
Реклама. ЧОУ ДПО «Образовательные технологии «Скилбокс (Коробка навыков)», ИНН: 9704088880
LazyInitializationExceptionLazyInitializationException
— это одно из наиболее распространенных исключений, которые вы можете столкнуться при работе с Hibernate
в Java.
Это исключение обычно возникает, когда вы пытаетесь получить доступ к лениво инициализированной коллекции или объекту из сущности, которая была инициализирована внутри Hibernate
сессии, но эта сессия уже закрыта к моменту обращения к этой коллекции или объекту.
В этом примере мы пытаемся получить доступ к списку книг автора после того, как транзакция была закоммичена и EntityManager
закрыт, что приводит к LazyInitializationException
.
Существует несколько способов обработки LazyInitializationException
:
1. Использование EAGER
загрузки
2. Использование JOIN FETCH
в запросах
3. Использование Hibernate.initialize()
4. Использование @Transactional
SortedMapSortedMap
является интерфейсом, который расширяет Map
и предоставляет гарантию порядка элементов на основе сортировки ключей.
Он может быть полезен, когда вам нужно хранить пары ключ-значение в отсортированном порядке, например, для обработки данных в хронологическом порядке или для вывода элементов в алфавитном порядке.
В этом примере мы используем методы firstKey
и lastKey
для получения первого и последнего ключа в отсортированном порядке. А также создаем подмножество элементов с помощью метода subMap
, указывая диапазон ключей.
Метод interrupt()interrupt()
используется для прерывания потока исполнения. Этот метод является частью класса Thread
и позволяет прервать поток, вызывая исключение InterruptedException
, если поток находится в состоянии ожидания или блокировки. Если поток не находится в таком состоянии, метод interrupt()
устанавливает флаг прерывания, который можно проверить с помощью метода isInterrupted()
.
Метод interrupt()
может применяться в различных ситуациях, например, когда необходимо остановить поток по запросу пользователя или когда поток должен завершиться по достижении определенного условия.
CompletableFuture
CompletableFuture в пакете java.util.concurrent является классом, который предоставляет мощный и гибкий подход к асинхронному программированию. Он позволяет выполнять асинхронные операции и обрабатывать их результаты, комбинировать несколько операций и управлять зависимостями между ними.
Помимо операций, представленных на изображении, CompletableFuture
также предоставляет множество других методов для работы с асинхронными операциями, таких как thenApply()
, thenCompose()
, thenCombine()
, exceptionally()
и другие, которые позволяют обрабатывать результаты, комбинировать операции, обрабатывать исключения и многое другое. Это делает CompletableFuture
мощным инструментом для асинхронного программирования.
Ключевое слово super
Ключевое слово super
используется для вызова конструктора или метода родительского класса.
Оно часто используется в конструкторах подклассов для вызова конструктора родительского класса и обеспечения корректной инициализации объекта.
В этом примере у нас есть два класса: Animal
и Dog
. В конструкторе класса Dog
используется ключевое слово super
для вызова конструктора родительского класса Animal
.
Также в методе makeSound()
класса Dog
используется super
для вызова метода makeSound()
родительского класса Animal
.
Spring Web MVC
Spring Web MVC является ключевым компонентом Spring Framework, который предоставляет модель-представление-контроллер (MVC) архитектуру для разработки веб-приложений на Java. Он предлагает гибкую и мощную инфраструктуру для разработки веб-приложений с упором на простоту использования и расширяемость. Spring Web MVC
предоставляет множество возможностей, таких как обработка исключений, валидация данных, поддержка различных представлений (например: Thymeleaf
, JSP
) и многое другое.
В этом примере мы создали простое веб-приложение с использованием Spring Web MVC
. Контроллер обрабатывает HTTP-запросы и возвращает строку в качестве ответа.
Перейдя по адресу http://localhost:8080/hello
мы увидим сообщение "Hello, World!". Добавив параметр name
в URL мы увидим сообщение "Hello, [значение, присвоенное параметру name]!".
Spring AOP
Spring AOP (Aspect-Oriented Programming) — это подход, используемый в Spring Framework для реализации аспектов в приложении.
Аспекты представляют собой модули, которые инкапсулируют поведение, общее для разных частей приложения.
Spring AOP позволяет разработчикам определить аспекты, советы (advice) и точки соединения (join points) для перехвата и изменения поведения методов без изменения исходного кода.
В данном примере Spring AOP используется для логирования вызова метода exampleMethod()
без изменения исходного кода сервиса. Аспект LoggingAspect
перехватывает вызов метода и выполняет совет logBefore()
перед выполнением метода.
Результатом работы кода будет вывод:
Method exampleMethod is called
Executing exampleMethod
⚡Как получить работу в IT?
IT — сфера с чудовищной конкуренцией, где каждый месяц прибавляется огромное количество людей, желающих занять ту или иную должность: начиная от стажера и тестировщика, и заканчивая Senior Developer. К Джунам требования растут каждый год, и пробиться на позицию с приличным оффером очень трудно.
Ищут работу, как правило, один из двух типов IT-специалистов:
🔸 Начинающие, кто в поиске хорошего предложения со старта;
🔸 Кодеры с опытом, кто хочет получать больше, чем есть сейчас.
И тем и другим подойдет семинар «Как найти работу в IT?».
👉На семинаре мы расскажем:
☑️С чего начать подготовку базы для собеседований;
☑️Как подготовиться к интервью, и на что смотрят рекрутеры;
☑️Как проходят поведенческое и техническое интервью;
☑️ На какие моменты стоит обратить особое внимание.
Семинар проводят:
Ведущий. Опытный разработчик, с 6+ опыта разработки на Java, прошедший более 30 собеседований в топовые IT-компании уровня FAANG, сейчас работа в Uber в Амстердаме;
Тайный IT-рекрутер. Более 2-х лет опыта работы по найму разработчиков разного уровня: от Junior до Senior, IT-архитекторов и т.д. Начинала с работы в Yandex, и уже помогла найти отличные позиции для более чем 200+ инженеров.
Семинар полностью БЕСПЛАТНЫЙ. Регистрация по ссылке внизу:
ХОЧУ НА СЕМИНАР
Требуются парни и девушки в возрасте 19–40 лет, желающие работать в сфере IT. Опыт в программировании не нужен.
С 13 по 19 июня проводим бесплатный онлайн-интенсив по Frontend-разработке, где будем учить, как разрабатывать сайты и веб-приложения.
За эти 7 дней обучения ты:
1. Создашь полноценный веб-сайт на HTML и CSS;
2. Оживишь страницу с помощью JavaScript;
3. Используешь фронтенд-фреймворк Angular;
4. Подключишь Backend и загрузишь сайт на хостинг;
5. Получишь советы по доработке своего проекта;
6. Узнаешь сколько можно зарабатывать и как работать;
7. Получишь в подарок чек-лист «45 мест для поиска работы».
А главное, ты увидишь, что разрабатывать сайты и приложения не так сложно, как кажется. И поймёшь, как тебе развиваться в этой профессии, чтобы уже в следующем году зарабатывать от 1000$ на вёрстке сайтов.
👉 Проскочить на интенсив бесплатно