KT Kotlin  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Взаимодействие с Java

Задания посвящены местам, где граница Java и Kotlin снимает часть привычных гарантий: платформенные типы, SAM, JVM-аннотации и проверяемые исключения. Важно отделять удобство вызова от реальной безопасности контракта.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 6 тематических шкал.
Вопрос 1 из 30
Для «Checked-контракт для Java» предлагают правку: Документировать и типизировать ожидаемые ошибки на публичной границе; для Kotlin API рассмотреть Result или доменный sealed-тип. Какой компромисс нельзя пропустить?
Вопрос 2 из 30
Какой тест особенно важен для platform type?
KotlinТестирование и инструменты · Null на реальной Java-границе
// Проследите фактическое выполнение без изменения кода.
// Java stub возвращает null вопреки неаннотированной сигнатуре
val api = mock<LegacyApi> { on { findName() } doReturn null }
val result = runCatching { length(api) }
Вопрос 3 из 30
Какой принцип лежит в основе поведения «Interop-адаптер как граница»?
KotlinАрхитектура и конкурентность · Interop-адаптер как граница
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
class JavaClientAdapter(private val client: LegacyClient) {
    suspend fun fetch(id: String): Item = withContext(Dispatchers.IO) {
        val raw = requireNotNull(client.fetch(id)) { "LegacyClient returned null for $id" }
        raw.toDomain()
    }
}
Вопрос 4 из 30
Почему пример «Неаннотированный Java-результат» даёт именно такой результат?
KotlinПлатформенные типы Java · Неаннотированный Java-результат
// На ревью требуется объяснить причину поведения.
// Java: String findName();  // без аннотации nullability
fun length(api: LegacyApi): Int {
    val name = api.findName()
    return name.length
}
Вопрос 5 из 30
Как превратить неявное предположение в проверяемый контракт «Лямбда для Java SAM»?
KotlinПреобразование SAM · Лямбда для Java SAM
// Сохраните назначение фрагмента, но укрепите его контракт.
// Java API: void onReady(Runnable action)
fun register(api: JavaApi) {
    api.onReady { println("ready") }
}
Вопрос 6 из 30
Что проверить отдельно, чтобы не принять «Статический фасад companion object» за универсальное правило?
Вопрос 7 из 30
Какой принцип лежит в основе поведения «Null на реальной Java-границе»?
KotlinТестирование и инструменты · Null на реальной Java-границе
// На ревью требуется объяснить причину поведения.
// Java stub возвращает null вопреки неаннотированной сигнатуре
val api = mock<LegacyApi> { on { findName() } doReturn null }
val result = runCatching { length(api) }
Вопрос 8 из 30
Как превратить неявное предположение в проверяемый контракт «Interop-адаптер как граница»?
KotlinАрхитектура и конкурентность · Interop-адаптер как граница
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
class JavaClientAdapter(private val client: LegacyClient) {
    suspend fun fetch(id: String): Item = withContext(Dispatchers.IO) {
        val raw = requireNotNull(client.fetch(id)) { "LegacyClient returned null for $id" }
        raw.toDomain()
    }
}
Вопрос 9 из 30
Как укрепить «Неаннотированный Java-результат», не переписывая соседние модули?
KotlinПлатформенные типы Java · Неаннотированный Java-результат
// Сохраните назначение фрагмента, но укрепите его контракт.
// Java: String findName();  // без аннотации nullability
fun length(api: LegacyApi): Int {
    val name = api.findName()
    return name.length
}
Вопрос 10 из 30
Где поведение «Лямбда для Java SAM» требует отдельной проверки?
Вопрос 11 из 30
Какую обратную сторону имеет решение для «Статический фасад companion object»: Добавлять аннотацию только после проверки Java-вызова и бинарного контракта, а не украшать весь Kotlin API автоматически?
Вопрос 12 из 30
Зачем здесь `@Throws`?
KotlinИсключения · Checked-контракт для Java
// Проследите фактическое выполнение без изменения кода.
class Loader {
    @Throws(java.io.IOException::class)
    fun load(path: String): String = java.io.File(path).readText()
}
Вопрос 13 из 30
Где поведение «Interop-адаптер как граница» требует отдельной проверки?
Вопрос 14 из 30
Какой дополнительный сценарий нужен для «Неаннотированный Java-результат»?
Вопрос 15 из 30
Какова практическая цена решения «Лямбда для Java SAM»: При публичном межъязыковом callback API предпочитать функциональный интерфейс с ясным именем и исключительной политикой?
Вопрос 16 из 30
Что меняет `@JvmStatic` для Java-потребителя?
KotlinАннотации JVM · Статический фасад companion object
// Проследите фактическое выполнение без изменения кода.
class Greeter {
    companion object {
        @JvmStatic fun hello(name: String) = "Hi, $name"
    }
}
Вопрос 17 из 30
Какое правило нужно применить, чтобы объяснить «Checked-контракт для Java»?
KotlinИсключения · Checked-контракт для Java
// На ревью требуется объяснить причину поведения.
class Loader {
    @Throws(java.io.IOException::class)
    fun load(path: String): String = java.io.File(path).readText()
}
Вопрос 18 из 30
Как сделать ответственность во фрагменте «Null на реальной Java-границе» понятной следующему разработчику?
KotlinТестирование и инструменты · Null на реальной Java-границе
// Сохраните назначение фрагмента, но укрепите его контракт.
// Java stub возвращает null вопреки неаннотированной сигнатуре
val api = mock<LegacyApi> { on { findName() } doReturn null }
val result = runCatching { length(api) }
Вопрос 19 из 30
Какой побочный эффект существеннее остальных после правки «Неаннотированный Java-результат»: Добавить поддерживаемые nullability-аннотации в Java API или проверить результат на Kotlin-границе и преобразовать его в честный доменный тип?
Вопрос 20 из 30
Почему лямбда допустима вместо `Runnable`?
KotlinПреобразование SAM · Лямбда для Java SAM
// Проследите фактическое выполнение без изменения кода.
// Java API: void onReady(Runnable action)
fun register(api: JavaApi) {
    api.onReady { println("ready") }
}
Вопрос 21 из 30
Почему поведение «Статический фасад companion object» не является случайностью?
KotlinАннотации JVM · Статический фасад companion object
// На ревью требуется объяснить причину поведения.
class Greeter {
    companion object {
        @JvmStatic fun hello(name: String) = "Hi, $name"
    }
}
Вопрос 22 из 30
Какую точечную правку стоит принять на ревью фрагмента «Checked-контракт для Java»?
KotlinИсключения · Checked-контракт для Java
// Сохраните назначение фрагмента, но укрепите его контракт.
class Loader {
    @Throws(java.io.IOException::class)
    fun load(path: String): String = java.io.File(path).readText()
}
Вопрос 23 из 30
Какой тест лучше всего защищает край контракта «Null на реальной Java-границе»?
Вопрос 24 из 30
Какую обратную сторону имеет решение для «Interop-адаптер как граница»: Зафиксировать thread-safety клиента, ограничить параллелизм и возвращать Kotlin-доменную модель без Java mutable collections?
Вопрос 25 из 30
На какой контракт языка или библиотеки опирается «Лямбда для Java SAM»?
KotlinПреобразование SAM · Лямбда для Java SAM
// На ревью требуется объяснить причину поведения.
// Java API: void onReady(Runnable action)
fun register(api: JavaApi) {
    api.onReady { println("ready") }
}
Вопрос 26 из 30
Что следует изменить прежде всего во фрагменте «Статический фасад companion object»?
KotlinАннотации JVM · Статический фасад companion object
// Сохраните назначение фрагмента, но укрепите его контракт.
class Greeter {
    companion object {
        @JvmStatic fun hello(name: String) = "Hi, $name"
    }
}
Вопрос 27 из 30
Какой пограничный сценарий обязательно добавить к проверкам «Checked-контракт для Java»?
Вопрос 28 из 30
Какую обратную сторону имеет решение для «Null на реальной Java-границе»: Добавить маленький Java-модуль-потребитель в сборку и compile-test для наиболее важных публичных сигнатур?
Вопрос 29 из 30
Почему адаптер — подходящая архитектурная граница?
KotlinАрхитектура и конкурентность · Interop-адаптер как граница
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
class JavaClientAdapter(private val client: LegacyClient) {
    suspend fun fetch(id: String): Item = withContext(Dispatchers.IO) {
        val raw = requireNotNull(client.fetch(id)) { "LegacyClient returned null for $id" }
        raw.toDomain()
    }
}
Вопрос 30 из 30
Где находится риск в Kotlin-коде?
KotlinПлатформенные типы Java · Неаннотированный Java-результат
// Проследите фактическое выполнение без изменения кода.
// Java: String findName();  // без аннотации nullability
fun length(api: LegacyApi): Int {
    val name = api.findName()
    return name.length
}

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу