Блиц скрининг Яндекса

Можно ли объявить var в Kotlin без присваивания значения?

  • Можно сделать "ленивое" присвавание через lateinit. Но надо помнить, что при попытке прочтения этой переменной до присванивая какого-то значения, может быть получен UninitializedPropertyAccessException
  • Если var используется как параметр в классе, то можно использовать комбинацию из геттеров / сеттеров
    private var someVar: String  
    get() = "Some value"  
    set(value) {}  
    
    В данном примере значение будет immutable и всегда возвращать `Some value`, в сеттере же можно указывать дополнительную логику, которая однако не должна выполнять присвание `field = value` (вызывает ошибку компиляции).

## Как в Kotlin задекларировать, что метод может выбрасывать исключение?

Для предупреждения, что метод может иметь исключения, используется аннотация `@Throws`, используется для вызова метода из Java.  
Если этот метод не будет использоваться в Java, то `@Throws` можно не использовать, потому что в Kotlin нет checked exceptions

- Проверяемые исключения - это такие исключения, которые компилятор может вызвать при сборке, например наследуемые от `Exception`. Непроверяемые - это например `RuntimeException`. Впроче, для Kotlin это неактуально

## Поддерживает ли Kotlin расширяемость классов? (можно ещё задать вопрос, как "Позволяет ли Kotlin наследовать один класс от другого?")

По умолчанию классы в Kotlin помечены как `final`, что значит, что они нерасширяемые, иначе используется ключевое слово `open` перед `class`.  
Вполне очевидно, что например, абстрактные классы сразу же являются open.

## Какие scoped-функции в Kotlin вы знаете?

Это функции области видимости - позволяют выполнить для объекта код в виде лямбда выражения. Основное scoped функции это:

- `let`. Получает объект в виде переменной it и возвращает результат вычисления (а не сам объект)
- `with` - аналогично, только ссылка на объект идет параметром `this`
- `run`. Похожа на `with`, но может быть использована для проверки на nullable, например `item?.run { 100 } ?: -1`
- `apply` - выполняет блок кода, но возвращается сам объект
- `also` - выполняет блок кода, объект передается параметром `it`, возвращается непосредственно объект, над которым выполняется код

## Можно ли использовать ключевое слово inline для любой функции?

Можно, но работает `inline` только для функций с параметром в виде лямбды или для `reified`. В остальных случая компилятор скорее всего для оптимизации проигнорирует

## Как в Kotlin сравнивать объекты по ссылке?
===

## Где в Java может использоваться ключевое слово final?
- Если класс не подразумевается расширяемым, то используется конструкция `final class`. В Java, в отличие от Kotlin, все классы изначально открытые и доступны для расширения
- Параметры класса, которые подразумеваются как immuatable  
    ```kotlin
    public class Test {  
	    private final String name = "Sasha";  
    }
  • Метод в классе, который не должен переопределяться у потомков

Асимптотическая сложность метода put класса HashMap?

При отсутствии коллизий - O(1), иначе O(n).

Асимптотическая сложность метода add класса ArrayList?

При вставке в конец O(1). При вставке в начало / середину - O(n)

Как фрэймворк узнает о созданных вами компонетах? Где их нужно декларировать? Все ли компоненты нужно декларировать в манифесте? Что декларируется в манифесте, кроме Android компонентов?

Все основные компоненты описаны в файле Manifest.xml - activity, broadcast receiver, service, content provider.
Broadcast receivers бывают implicit и explicit. Implicit - это те, которые могут вызываться системой или другими приложениями, и поэтому они должны описываться в манифесте (например, ACTION_BOOT_COMPLETED). Для передачи информации между компонентами внутри приложения с помощью BR указывать их в манифесте не надо.