Javanese Online

Kotlin. Вопросы для собеседования

* — вопросы о компиляторе и генерируемом байт-коде

Классы

Объекты

Функции

Выражения

Дженерики

Корутины

Комментарии к статье

{"type":"articleComments","id":"498e4499-a446-4020-be68-30f7b5d67458","comments":[{"id":"b9d0fddf-0283-4181-81d0-9821d81fd7c4","authorSrc":"GitHub","authorId":"maxdoctorkurt","text":"\"Как компилируются ....\"\nВ каких задачах это знание используется, связанные ошибки и т. д.?\nВообще неплохо было бы описать в общем виде, где эти тонкости проявляются и зачем задавать это на собеседовании (знание языка ради знания языка это не ответ). Например вот эта %featurename% используется при оптимизации кода, а вот та влияет на качество архитектуры. По логике, если сюда пришел \"профи\", нечего ему тут смотреть он и так все знает. Всем остальным (мне в какой то степени) это покажется пособием на тему \"как зарезать человека на собесе каверзными вопросами\"\n\n","added":1547387145526,"answers":[{"id":"2ea4f2c0-a2cd-47b0-a616-76b545dda020","authorSrc":"GitHub","authorId":"Miha-x64","text":"На оптимизацию кода, конечно, влияет всё. Например, можно встретить в интернете такой Kotlin-код для Android:\n```\nval someView by lazy { findViewById(R.id.some_view) }\n```\nЕсли знаешь особенности компилятора — сразу понятно: на такую конструкцию сгенерировалось два «лишних» класса. Один — реализация `() -> View` для лямбды, второй — `KProperty` для property delegate. И вопросов «почему тормозит на старте» не возникает — более того, человек просто не пишет так с самого начала, т. к. понимает, что классы занимают место в APK, а на рантайме их нужно загрузить, верифицировать, слинковать и скомпилировать в машинный код.\n\nДругой пример. Java:\n```\naddListener(OnChangeListener) { ... }\nremoveListener(OnChangeListener) { ... }\n```\nKotlin:\n```\nval listener = { whatever -> ... }\n\nfun create() {\n javaObj.addListener(listener)\n}\n\nfun destroy() {\n javaObj.removeListener(listener)\n}\n```\nВ `create` `listener` (типа `(Something) -> Unit`) заворачивается в адаптер, чтобы соответствовать типу `OnChangeListener`. В `destroy` он заворачивается в такой же адаптер, только экземпляр другой, первому не равный, поэтому отписки не происходит.\n\nТретий пример: некоторые часто спрашивают, потокобезопасны ли object declarations. А можно просто посмотреть в байт-код — и сразу будет однозначный ответ: да, потокобезопасны, потому что создание экземпляра происходит в статическом инициализаторе, а ClassLoader обязан обеспечить потокобезопасность его выполнения.\n\n«Зарезать» ли кандидата — решает, как всегда, собеседующий. При большом желании он может сделать это и вопросом «сколько будет 2+2?» Я не предлагаю требовать/знать достоверно по каждому пункту, тем более — со звёздочкой. Главное — чтобы кандидат знал, как эти ответы найти (и проверить достоверность).","added":1548188972243,"answers":[{"id":"adae81c0-ea55-4d79-a2bb-3348737b6e43","authorSrc":"GitHub","authorId":"Miha-x64","text":"Про два лишних класса я не прав. Лишний класс генерируется один — для лямбды.\n`KProperty` же создаётся рефлекшеном.","added":1549984975616,"answers":[]}]}]}]}

Javanese.Online в GitHub

Чаты и каналы в Telegram

RSS-лента