KT Kotlin  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Классы и конструкторы

Тест проверяет, как Kotlin создаёт объект: в каком порядке вычисляются аргументы, свойства и блоки init, что доступно из конструктора и как видимость меняет устройство класса. Большинство ловушек скрыто не в синтаксисе, а в последовательности инициализации.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 20 вопросов отведено 55 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 4 тематических шкал.
Вопрос 1 из 20
Для «Параметр primary constructor» предлагают правку: Хранить нормализованное значение как отдельное read-only свойство, а исходный параметр не превращать в состояние без необходимости. Какой компромисс нельзя пропустить?
Вопрос 2 из 20
Каков результат выполнения?
KotlinБлоки инициализации init · Инвариант в init
// Проследите фактическое выполнение без изменения кода.
class Range(val start: Int, val end: Int) {
    init { require(start <= end) { "перевёрнутый диапазон" } }
    val size = end - start + 1
}

fun main() = println(Range(3, 5).size)
Вопрос 3 из 20
На какой контракт языка или библиотеки опирается «Публичное чтение и закрытая запись»?
KotlinСвойства · Публичное чтение и закрытая запись
// На ревью требуется объяснить причину поведения.
class Counter {
    var value: Int = 0
        private set

    fun add(delta: Int) { value += delta }
}

fun main() {
    val c = Counter()
    c.add(3)
    println(c.value)
}
Вопрос 4 из 20
Что изменить в «Границы internal и private», чтобы скрытое допущение стало явным контрактом?
KotlinВидимость · Границы internal и private
// Сохраните назначение фрагмента, но укрепите его контракт.
internal class Parser {
    private fun clean(s: String) = s.trim()
    fun parse(s: String): Int = clean(s).toInt()
}

fun main() = println(Parser().parse(" 42 "))
Вопрос 5 из 20
Почему пример «Инвариант в init» даёт именно такой результат?
KotlinБлоки инициализации init · Инвариант в init
// На ревью требуется объяснить причину поведения.
class Range(val start: Int, val end: Int) {
    init { require(start <= end) { "перевёрнутый диапазон" } }
    val size = end - start + 1
}

fun main() = println(Range(3, 5).size)
Вопрос 6 из 20
Какую правку выбрать, чтобы сохранить назначение «Публичное чтение и закрытая запись» и убрать хрупкость?
KotlinСвойства · Публичное чтение и закрытая запись
// Сохраните назначение фрагмента, но укрепите его контракт.
class Counter {
    var value: Int = 0
        private set

    fun add(delta: Int) { value += delta }
}

fun main() {
    val c = Counter()
    c.add(3)
    println(c.value)
}
Вопрос 7 из 20
Какой сценарий выявит скрытое ограничение «Границы internal и private»?
Вопрос 8 из 20
Какой результат даст пример «Параметр primary constructor» без изменения окружения?
KotlinОсновной конструктор · Параметр primary constructor
// Проследите фактическое выполнение без изменения кода.
class Token(raw: String) {
    val value = raw.trim().lowercase()
}

fun main() = println(Token("  AbC ").value)
Вопрос 9 из 20
Какой соседний случай отличает устойчивое решение «Публичное чтение и закрытая запись» от удачного примера?
Вопрос 10 из 20
Для «Границы internal и private» предлагают правку: Публиковать минимальный API модуля, а детали разбора оставлять `internal` или `private`, не полагаясь только на соглашение имён. Какой компромисс нельзя пропустить?
Вопрос 11 из 20
Какое правило определяет поведение фрагмента «Параметр primary constructor»?
KotlinОсновной конструктор · Параметр primary constructor
// На ревью требуется объяснить причину поведения.
class Token(raw: String) {
    val value = raw.trim().lowercase()
}

fun main() = println(Token("  AbC ").value)
Вопрос 12 из 20
Как превратить неявное предположение в проверяемый контракт «Инвариант в init»?
KotlinБлоки инициализации init · Инвариант в init
// Сохраните назначение фрагмента, но укрепите его контракт.
class Range(val start: Int, val end: Int) {
    init { require(start <= end) { "перевёрнутый диапазон" } }
    val size = end - start + 1
}

fun main() = println(Range(3, 5).size)
Вопрос 13 из 20
Каков результат в пределах того же модуля?
KotlinВидимость · Границы internal и private
// Проследите фактическое выполнение без изменения кода.
internal class Parser {
    private fun clean(s: String) = s.trim()
    fun parse(s: String): Int = clean(s).toInt()
}

fun main() = println(Parser().parse(" 42 "))
Вопрос 14 из 20
Что изменить в «Параметр primary constructor», чтобы скрытое допущение стало явным контрактом?
KotlinОсновной конструктор · Параметр primary constructor
// Сохраните назначение фрагмента, но укрепите его контракт.
class Token(raw: String) {
    val value = raw.trim().lowercase()
}

fun main() = println(Token("  AbC ").value)
Вопрос 15 из 20
Какой дополнительный сценарий нужен для «Инвариант в init»?
Вопрос 16 из 20
В «Публичное чтение и закрытая запись» выбрали решение: Оставить внешний контракт read-only и проводить изменения через методы, которые защищают инварианты счётчика. Какова его реальная цена?
Вопрос 17 из 20
Какой сценарий выявит скрытое ограничение «Параметр primary constructor»?
Вопрос 18 из 20
Предложенная правка для «Инвариант в init» звучит так: Проверять инварианты до публикации объекта и давать сообщению об ошибке конкретное значение, нарушившее контракт. Какой недостаток важнее обсудить?
Вопрос 19 из 20
Что выведет фрагмент «Публичное чтение и закрытая запись»?
KotlinСвойства · Публичное чтение и закрытая запись
// Проследите фактическое выполнение без изменения кода.
class Counter {
    var value: Int = 0
        private set

    fun add(delta: Int) { value += delta }
}

fun main() {
    val c = Counter()
    c.add(3)
    println(c.value)
}
Вопрос 20 из 20
Какое правило определяет поведение фрагмента «Границы internal и private»?
KotlinВидимость · Границы internal и private
// На ревью требуется объяснить причину поведения.
internal class Parser {
    private fun clean(s: String) = s.trim()
    fun parse(s: String): Int = clean(s).toInt()
}

fun main() = println(Parser().parse(" 42 "))

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

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

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

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