Знаком ли с Java
Что проверяют
Современный Android пишется на Kotlin, но Java никуда не делась: старые модули, библиотеки, исходники Android SDK и AOSP. Интервьюер хочет понять, сможете ли вы читать и править Java-код и не сломать его на стыке с Kotlin. Следом обычно спрашивают про взаимодействие двух языков или просят объяснить что-то из основ: equals/hashCode, дженерики, утечки памяти.
Как отвечать
Ответьте честно и с уровнем: «писал на Java N лет, последние проекты на Kotlin, Java-модули поддерживаю и мигрирую». Годы и проекты должны быть ваши, дальше подкрепите конкретикой по Android:
- интероп с Kotlin: платформенные типы (
String!) и почему без аннотаций@Nullable/@NonNullна стороне Java Kotlin пропускаетNullPointerException;@JvmStatic,@JvmOverloads,@JvmFieldдля удобного вызова Kotlin из Java;@Throws, потому что в Kotlin нет проверяемых исключений; - среда выполнения: код компилируется в байткод, а затем D8 и R8 превращают его в DEX для ART. Новые API Java вроде
java.timeна старых версиях Android доступны через desugaring (coreLibraryDesugaringEnabled); - утечки: анонимный внутренний класс и нестатический
Handlerдержат неявную ссылку наActivity, статическое поле сContextдержит экран в памяти. Отсюдаstaticвложенные классы иWeakReference; - многопоточность:
ExecutorService,synchronized,volatile.AsyncTaskобъявлен устаревшим в API 30, в новом коде его быть не должно; - миграция: конвертер Android Studio даёт черновик, но после него нужен ручной проход по nullability и идиомам.
Если с Java вы почти не работали, так и скажите, а затем покажите, что основы JVM знаете и Java-код читаете: для Kotlin-разработчика это нормальная позиция.
Где спотыкаются
Отвечают «Java устарела, пишу только на Kotlin». Это звучит как неготовность работать с половиной реальных кодовых баз.
Не знают про платформенные типы и получают NPE в Kotlin-коде, который вызывает Java-метод без аннотаций.
Называют большой стаж и плывут на базовом: контракт equals и hashCode, разница между List<? extends T> и List<T>, почему String неизменяемая.