Получи случайную криптовалюту за регистрацию!

Java Interview Review

Логотип телеграм канала @javasobes — Java Interview Review J
Логотип телеграм канала @javasobes — Java Interview Review
Адрес канала: @javasobes
Категории: Технологии , Образование
Язык: Русский
Страна: Россия
Количество подписчиков: 7.50K
Описание канала:

Популярные вопросы и ответы с собеседований на Java-разработчика.
Канал для Android-разработчиков @AndroidSobes
Связаться с нами @SobesAdmin
http://itsobes.ru/

Рейтинги и Отзывы

3.00

3 отзыва

Оценить канал javasobes и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

1

4 звезд

0

3 звезд

1

2 звезд

0

1 звезд

1


Последние сообщения 3

2020-11-04 18:01:18 Что такое phase, goal и lifecycle в Maven? (2/2)

Когда аргументом команды mvn передается фаза, кроме нее самой выполнятся все предшествующие ей в том же лайфсайкле. Вместо фазы возможно явно передать цель (mvn clean:clean вместо mvn clean), но тогда никакие другие цели вызваны не будут (в данном примере цели фазы pre-clean).

Фазы всегда выполняются в том порядке, в котором они следуют в жизненном цикле. Если к одной фазе привязано несколько целей, они отработают в порядке объявления в pom.xml.

Некоторые плагины могут предоставлять цели, не привязанные ни к каким фазам. Их можно вызвать только явно.

Если в команду mvn передается несколько фаз/целей, они выполнятся последовательно. Каждая цель в процессе выполняется только однажды.

Так, вызов mvn test package – то же самое что mvn package, потому что в первом случае все цели из фазы test (и предыдущих) уже будут исполнены и пропущены в package. mvn clean install так заменить не получится, потому что это фазы из разных жизненных циклов.

#Инструменты
6.4K views15:01
Открыть/Комментировать
2020-11-02 18:00:56 Что такое phase, goal и lifecycle в Maven? (1/2)

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.

#Инструменты
5.9K views15:00
Открыть/Комментировать
2020-10-28 18:01:09 Чем IllegalArgumentException лучше чем NullPointerException?

Речь здесь идет о выборе подхода к обработке ошибки, когда пользователь передал в non-nullable параметр значение null.

Технически, оба этих исключения unchecked, оба из стандартной библиотеки, и особой разницы нет.

Однако семантически эти исключения отличаются. NullPointerException говорит пользователю о попытке обратиться к членам класса через null-ссылку. Это лишь техническое описание, без информации для пользователя о логике программы. IllegalArgumentException, напротив, явно говорит о недопустимом значении аргумента – это понятная для пользователя информация.

Семантическая разница иногда проявляется и технически. Например, в обработчиках исключений некоторых фреймворков именно IllegalArgumentException превращается в HTTP-ответ с кодом 400 Bad Request, в то время как NPE остается общим кодом «неизвестной ошибки» 500 Internal Server Error.

Кроме того, чтобы выбросить NullPointerException не требуется явного кода обработки null. Остается неизвестным, ожидаемо ли в этом случае исключение, или разработчик попросту забыл добавить корректную обработку.

Явная обработка null и выброс IllegalArgumentException для пользователя кода будет служить документацией, а сообщение об ошибке в аргументе его конструктора внесет еще больше ясности.

#Классы
7.0K views15:01
Открыть/Комментировать
2020-10-26 18:00:47 TestNG или JUnit – что выбрать?

Ответ на такого рода вопросы всегда зависит от дополнительных деталей контекста. Не просто так TestNG и JUnit – два самых популярных фреймворка для unit-тестирования, у каждого есть свои плюсы.

JUnit – золотой стандарт. Это библиотека из семейства xUnit, которое во многом сформировало unit-тестирование таким, каким мы знаем его сегодня. И до сих пор, оставаясь самой популярной библиотекой для тестирования, она продолжает активно развиваться.

Фреймворк TestNG был вдохновлен JUnit, но добавляет небольшой набор дополнительных фич. Некоторые из указанных на сайте возможностей на самом деле доступны и в JUnit: например data-driven тесты, или параллельное выполнение. Подробное сравнение JUnit 4 и TestNG доступно в статье от mkyong.

Стоит отметить, что современный JUnit 5 имеет достаточно заметные отличия от JUnit 4, их можно рассматривать как разные фреймворки. Подробнее об отличиях читайте на хабре.

#Инструменты
5.9K views15:00
Открыть/Комментировать
2020-10-23 18:01:04 В чём разница между интерпретатором, AOT и JIT-компилятором?

Интерпретация – простое последовательное воспроизведение кода программы, команда за командой.

AOT-компиляция (ahead-of-time, статическая) – процесс превращения текста на языке программирования в нативный код на машинном языке. Так работают языки вроде C++. В современных JDK можно получить настоящий ahead-of-time скомпилированный машинный код с помощью утилиты jaotc.

JIT-компиляция (just-in-time, динамическая) – «умная» интерпретация. Среда выполнения анализирует исполняемый код, оптимизируя часто вызываемые участки. Таким способом программа работает значительно быстрее, и сохраняет при этом преимущества платформо-независимости оригинального кода. Именно с JIT-компиляцией связана необходимость «прогрева» программ перед тестированием производительности.

Эти термины относятся не только к JVM, но и ко множеству других языков программирования. Конкретно в Java байткод – интерпретируемый. Но в JVM по умолчанию работает JIT-компилятор. А процесс компиляции Java-кода в байткод можно назвать AOT-компиляцией.

Для взаимодействия с JIT-компилятором из кода в JDK поставляется класс java.lang.Compiler. Его методом disable() можно отключить JIT и перевести программу в режим простой интерпретации. Сейчас этот класс объявлен устаревшим и готовится к удалению.

Более красивый способ влиять на компилятор – передавать его настройки параметрами JVM. Параметр -Djava.compiler=NONE также переключит программу с JIT на интерпретатор. В теории, через этот же параметр можно подключить другой JIT-компилятор, альтернативный встроенному в JVM.

#JVM
6.2K views15:01
Открыть/Комментировать
2020-10-21 18:01:14 Как реализовать двусторонний обмен данными между потоками?

Вопрос, который зачастую дается в виде практической задачи. Конечно, результата можно добиться разными способами: парой атомарных переменных, критическими секциями, потокобезопасными коллекциями. Но полезно знать, что специально для этого случая в стандартной библиотеке java.util.concurrent есть простой класс Exchanger.

Класс содержит единственный метод V exchange(V x). Один поток передает в него данные, и встает в ожидание. Ожидание завершается, когда второй поток также приходит в метод exchange со своей порцией информации. В качестве результата вызова потоки получают данные друг друга.

На основе класса Exchanger удобно создавать пайплайны обработки данных. Первый поток выполняет свою часть обработки, и складывает результаты в буфер. В качестве буфера может работать любой многоразовый объект-контейнер. Когда он заполняется, следующий поток обменивает его на второй, пустой буфер. Таким образом два буфера используются поочередно, не выделяется лишний раз память и не нагружается GC. Далее из попарно обменивающихся буферами потоков может строиться длинная многопоточная цепочка обработки.

#Многопоточность
5.8K views15:01
Открыть/Комментировать
2020-10-19 18:00:47 От чего может случиться NoSuchMethodError?

Как очевидно из названия, программа пытается вызвать метод, которого не существует. В большинстве случаев это приводит к ошибке еще на этапе компиляции. Но в некоторых ситуациях о проблеме становится известно только во время выполнения, и тогда выбрасывается это исключение.

Вариантов таких ситуаций два. Либо проект был изменен и частично перекомпилирован; либо программа несовместима с внешней зависимостью: например неправильная версия jar-библиотеки в classpath.

Исключение NoSuchMethodError наследуется от LinkageError. Все такие ошибки – признаки несовместимых изменений после компиляции класса.

Не следует путать эту ошибку с NoSuchMethodException – исключением, которое случается при попытке вызвать несуществующий метод с помощью Reflection API. Важное отличие в том, что это не Error, его можно ловить и обрабатывать.

#JVM
5.4K views15:00
Открыть/Комментировать
2020-10-16 18:00:50 Что такое Hibernate?

Hibernate – популярная библиотека, которая реализует технологию JPA, обеспечивает объектно-реляционный маппинг (ORM).

По задумке она избавляет разработчика от проблем хранения объектно-ориентированных (инкапсуляция-полиморфизм-наследование) данных в реляционных таблицах.

Среди особенностей можно выделить такие, как HQL (объектно-ориентированный SQL), автоматическую генерацию таблиц, два уровня кэширования, независимость от конкретной базы данных.

На сегодняшний день Hibernate считается многими разработчиками отчасти устаревшей. На больших проектах она требует объемный набор XML-конфигураций, на практике зачастую приходится спускаться на уровень нативного SQL конкретной базы, а маппинг порой ведет себя неочевидно. Для более близкого знакомства с проблемами этой библиотеки рекомендуется доклад Николая Алименкова.

Несмотря на свои проблемы, Hibernate остается лучшей альтернативой самописным DAO. Её использует под капотом Spring Data.

Список возможных альтернатив можно найти на википедии.

#SQL
6.5K views15:00
Открыть/Комментировать