История про memory leaks, WeakReferences и ошибки при исправлении
#article
Попалась любопытная статья, где рассказывается о неверном использовании механизма ссылок
В ней описывается пример использования
Описываются все плюсы и минусы решений. Тут и EventBus, и LiveData, и RxJava с BehaviorRelay, да и многие другие, менее очевидные решения.
Множество информации можно почерпнуть тут.
#article
Попалась любопытная статья, где рассказывается о неверном использовании механизма ссылок
WeakReference.В ней описывается пример использования
WeakReference как костыля для работы с утечками памяти. Автор решил изучить вопрос, и рассмотрел несколько вариантов борьбы с этой проблемой.Описываются все плюсы и минусы решений. Тут и EventBus, и LiveData, и RxJava с BehaviorRelay, да и многие другие, менее очевидные решения.
Множество информации можно почерпнуть тут.
Несколько советов по Kotlin для Android разработчиков
#article #kotlin
Ни для кого не секрет, что сегодня Kotlin — это официальный язык для нативной разработки под Android. Он призван уменьшить количество написанного кода и улучшить его качество.
В целом, со своей задачей он справляется, однако не все разработчики используют все фичи этого языка при написании кода, делая всё «по старинке».
Попалась статья, которая даёт 7 советов написания кода «Kotlinic» способом. Вот несколько из них:
🔸используйте функцию `let`, чтобы проверить поле на null. Проверка на null — это очень распространённое действие, несмотря на то, что в Kotlin есть nullable-переменные. Многие забывают, что существует хорошая альтернатива
🔸используйте функции для создания списков. Очень часто мы для заполнения списков используем цикл
Например, заполнить список значениями по умолчанию можно в одну строку:
Но подобным образом можно заполнить список разными значениями:
🔸используйте `require` и `check` для работы с исключениями. Например, если мы хотим, чтобы наша переменная была больше нуля, то можно вызвать функцию:
🔸используйте `apply` и `with`, чтобы уменьшить повторы кода. Эти две функции полезны, если мы хотим сделать несколько действий с нашей переменной. Такое часто бывает при работе сo
🔸используйте методы `partition` и `groupBy` для списков. Эти функции помогают нам сделать несколько списков из одного по заданному условию.
Добавлю сюда ещё функцию
🔸используйте method references вместо lambda expressions для простых действий. Довольно интересный совет, который не так часто видишь в коде.
Например, у нас есть список объектов Person, который мы хотим преобразовать в список имён. Мы можем использовать method references в
Надеюсь, что вы нашли для себя полезный совет, который будете применять на практике. 🤓
#article #kotlin
Ни для кого не секрет, что сегодня Kotlin — это официальный язык для нативной разработки под Android. Он призван уменьшить количество написанного кода и улучшить его качество.
В целом, со своей задачей он справляется, однако не все разработчики используют все фичи этого языка при написании кода, делая всё «по старинке».
Попалась статья, которая даёт 7 советов написания кода «Kotlinic» способом. Вот несколько из них:
🔸используйте функцию `let`, чтобы проверить поле на null. Проверка на null — это очень распространённое действие, несмотря на то, что в Kotlin есть nullable-переменные. Многие забывают, что существует хорошая альтернатива
if not null выражению — функция let, в которой код превращается в a?.let { foo(a) }.🔸используйте функции для создания списков. Очень часто мы для заполнения списков используем цикл
for и забываем про средста Kotlin. Например, заполнить список значениями по умолчанию можно в одну строку:
val list = IntArray(10) { 1 }.asList(). Но подобным образом можно заполнить список разными значениями:
val list = List(5, {it*2}), что даст нам список от 0 до 8 с шагом 2.🔸используйте `require` и `check` для работы с исключениями. Например, если мы хотим, чтобы наша переменная была больше нуля, то можно вызвать функцию:
require(n >0) { Should be more than zero }.🔸используйте `apply` и `with`, чтобы уменьшить повторы кода. Эти две функции полезны, если мы хотим сделать несколько действий с нашей переменной. Такое часто бывает при работе сo
RecyclerView, которому нужно задать layout manager и несколько других свойств. 🔸используйте методы `partition` и `groupBy` для списков. Эти функции помогают нам сделать несколько списков из одного по заданному условию.
Добавлю сюда ещё функцию
groupByTo, в которой мы можем указать то, в какую структуру превратить наш список.🔸используйте method references вместо lambda expressions для простых действий. Довольно интересный совет, который не так часто видишь в коде.
Например, у нас есть список объектов Person, который мы хотим преобразовать в список имён. Мы можем использовать method references в
map, чтобы сделать это более красивым способом:val names = persons.map(Person::name).Надеюсь, что вы нашли для себя полезный совет, который будете применять на практике. 🤓
Немного про let
#kotlin #article
Во вчерашнем посте был первый совет с использованием let для проверки переменной на null. @atlantik_hak подкинул годную статью, где описываются примеры, когда не стоит использовать let для этих целей, а когда let — самое лучшее решение для проверки.
Итак, когда лучше не использовать let:
⭕ для проверки на null immutable переменной. Хотя и запись
⭕ если вы хотите использовать переменную только внутри let. Чаще всего мы делаем проверку именно для того, чтобы использовать её внутри блока. Например, мы хотим что-то сделать с webView:
вместо этого можно использовать функцию
который уберёт лишние
⭕ если хотите передать переменную дальше по цепочке. Например, если вы хотите указать размер списка, если он не null, а дальше что-то продолжить делать с ним. Альтернативным решением будет использование
Когда же тогда использовать let?
🟢 для проверки на null mutable переменной. Тут хорошо подходит let, так как он избавляет нас от дополнительного
🟢 если хотите использовать переменную снаружи от let. Например, если вы хотите проициализировать другие переменные тем классом, что был у вас:
Это удобнее для review кода, чем функция
🟢 когда у вас есть проверка из цепочки `?`. Например:
генерирует больше байткода, чем:
Спасибо подписчикам, которые дают обратную связь по постам ✌️.
И уверен, что теперь вы будете использовать
#kotlin #article
Во вчерашнем посте был первый совет с использованием let для проверки переменной на null. @atlantik_hak подкинул годную статью, где описываются примеры, когда не стоит использовать let для этих целей, а когда let — самое лучшее решение для проверки.
Итак, когда лучше не использовать let:
⭕ для проверки на null immutable переменной. Хотя и запись
a?.let { foo(a) } получается довольно изящной, она генерирует лишнюю переменную в байткоде, в отличии от аналога if not null. Врядли вы заметите огромную разницу, но если можно избежать создания лишней переменной, то почему бы этого не сделать.⭕ если вы хотите использовать переменную только внутри let. Чаще всего мы делаем проверку именно для того, чтобы использовать её внутри блока. Например, мы хотим что-то сделать с webView:
webviewSetting?.let {
it.javaScriptEnabled = true
it.databaseEnabled = true
}вместо этого можно использовать функцию
runwebviewSetting?.run {
javaScriptEnabled = true
databaseEnabled = true
}который уберёт лишние
it.⭕ если хотите передать переменную дальше по цепочке. Например, если вы хотите указать размер списка, если он не null, а дальше что-то продолжить делать с ним. Альтернативным решением будет использование
also, хотя это тоже не идеальное решение.Когда же тогда использовать let?
🟢 для проверки на null mutable переменной. Тут хорошо подходит let, так как он избавляет нас от дополнительного
? при взаимодействии с переменной. private var str: String? = null
fun process() {
str?.let { /*Do something*/ }
}🟢 если хотите использовать переменную снаружи от let. Например, если вы хотите проициализировать другие переменные тем классом, что был у вас:
var javaScriptEnabled = false
var databaseEnabled = false
webviewSetting?.let {
javaScriptEnabled = it.javaScriptEnabled
databaseEnabled = it.databaseEnabled
}Это удобнее для review кода, чем функция
run.🟢 когда у вас есть проверка из цепочки `?`. Например:
return string?.asIterable()?.distinct()?.sorted()генерирует больше байткода, чем:
return string?.let {
it.asIterable().distinct().sorted()
} Спасибо подписчикам, которые дают обратную связь по постам ✌️.
И уверен, что теперь вы будете использовать
let аккуратнее.Как сделать компилятор Kotlin умнее
#article #kotlin
Компилятор Kotlin довольно умный и даёт нам подсказки о наших же ошибках.
Одной из самых заметных фич в компиляторе Kotlin является smart casting. Это значит, что компилятор может выполнять приведение типов на основе проверок, выполненных разработчиком.
Однако механизм smart casting не безграничен. Например, компилятор может проверить переменные только в том блоке, где эти проверки были непосредственно выполнены.
Немногие разработчики знают, что можно написать контракты, которые помогут компилятору в его работе. Например, если вы создадите контракт, функция которого возвращает true, в случае если переменная не равна null, компилятор выполнит приведение типа и сделает нашу переменную non-nullable.
Contract DSL выглядит так:
Можно использовать следующие функции для того, чтобы описать контракт:
🔸returns(value) — описывает ситуацию, когда функция нормально возвращается с указанным значением.
🔸returnsNotNull() — описывает ситуацию, когда функция возвращает non-nullable значение.
🔸implies(booleanExpression) — указывает, что данный наблюдаемый эффект будет истинным при заданном booleanExpression
🔸callsInPlace(lambda, kind) — позволяет указать, как часто будет выполняться данная лямбда.
Краткое описание параметров способно запутать, но можно обратиться к статье, чтобы получить больше информации с примерами. Надеюсь, что в будущем появится ещё больше функций для описания контрактов 🤟.
#article #kotlin
Компилятор Kotlin довольно умный и даёт нам подсказки о наших же ошибках.
Одной из самых заметных фич в компиляторе Kotlin является smart casting. Это значит, что компилятор может выполнять приведение типов на основе проверок, выполненных разработчиком.
Однако механизм smart casting не безграничен. Например, компилятор может проверить переменные только в том блоке, где эти проверки были непосредственно выполнены.
Немногие разработчики знают, что можно написать контракты, которые помогут компилятору в его работе. Например, если вы создадите контракт, функция которого возвращает true, в случае если переменная не равна null, компилятор выполнит приведение типа и сделает нашу переменную non-nullable.
Contract DSL выглядит так:
fun foo(): Boolean {
contract {
// Effect
}
// Function body
}Можно использовать следующие функции для того, чтобы описать контракт:
🔸returns(value) — описывает ситуацию, когда функция нормально возвращается с указанным значением.
🔸returnsNotNull() — описывает ситуацию, когда функция возвращает non-nullable значение.
🔸implies(booleanExpression) — указывает, что данный наблюдаемый эффект будет истинным при заданном booleanExpression
🔸callsInPlace(lambda, kind) — позволяет указать, как часто будет выполняться данная лямбда.
Краткое описание параметров способно запутать, но можно обратиться к статье, чтобы получить больше информации с примерами. Надеюсь, что в будущем появится ещё больше функций для описания контрактов 🤟.