Комментарии 5
Про lateinit как-то натянуто, ИМХО.
Если нет уверенности, что не null — вызывайте isInitialized(). Но это уже костыль к возможной двойной архитектурной проблеме, в которой lateinit первый звоночек, но, зачастую, такие ленивые мемберы — абсолютно нормальное некостыльное решение, с тем же JavaFX и прочими bindings.
Многие пункты вызвали в памяти нетленку Дейкстры - "Писать на фортране можно на любом языке"
Кажется все эти "особенности" отражены в офф. документации, не?
Про lateinit уже сказали, если разраб не может проверить все ли ленивые переменные проинициализированы, то тут увы. Язык то тут причём?
Пример с функцией-расширением тоже какой-то натянутый, в чём проблема написать:
private val unsafeMap = ConcurrentHashMap<Int, Int>() ?
В примере про extension функцию contains() сложность алгоритма не меняется, а остаётся линейной. Просто добавляется лишняя runtime проверка: if (this is Collection), ну и + вызовы лишней обёртки, которые и влияют на производительность.
Про extension nullable toString() и всё остальное можно найти даже в переведённой русскоязычной документации.
Грабли, спрятанные в Kotlin