Блиц скрининг Яндекса
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";
}
При отсутствии коллизий - O(1), иначе O(n).
При вставке в конец O(1). При вставке в начало / середину - O(n)
Все основные компоненты описаны в файле Manifest.xml
- activity, broadcast receiver, service, content provider.
Broadcast receivers бывают implicit и explicit. Implicit - это те, которые могут вызываться системой или другими приложениями, и поэтому они должны описываться в манифесте (например, ACTION_BOOT_COMPLETED). Для передачи информации между компонентами внутри приложения с помощью BR указывать их в манифесте не надо.