Свойства класса — это переменные, которые хранят состояние объекта класса. Как и любая переменная, свойство может иметь тип, имя и значение.
В классе можно объявить свойства с помощью ключевого слова
var или val. Свойства, объявленные с var, могут быть изменены после их инициализации, а свойства, объявленные с val, только для чтения.class Person {
var name: String = ""
val age: Int = 0
}При создании своего класса мы хотим сами управлять его свойствами, контролируя то, какие данные могут быть предоставлены или перезаписаны. С этой целью создаются get и set методы (геттеры и сеттеры). Цель get-метода — вернуть значение, а set-метода — записать полученное значение в свойство класса.
var name: String = ""
get() = field.toUpperCase()
set(value) {
field = "Name: $value"
}
В данном примере свойство
name имеет тип String и начальное значение пустой строки. Геттер возвращает значение свойства, преобразованное к верхнему регистру. Сеттер устанавливает значение свойства с добавлением префикса "Name: " перед переданным значением. Слово field используется для обращения к текущему значению свойства.Если get и set методы не были созданы вручную, то для таких свойств Kotlin незаметно сам их генерирует. При этом для свойства, объявленного с
val, генерируется get-метод, а для свойства, объявленного с var — и get, и set методы.#буст #JuniorKit #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Хотите быстро отследить, что происходит в приложении на устройстве или эмуляторе?
На помощь приходит простая команда:
adb logcat | grep "MyTag"
— Подключается к логам Android-устройства или эмулятора
— Фильтрует вывод по тегу (например,
MyTag, который вы используете в Log.d(...))— Показывает только нужные строки, чтобы не тонуть в море системных логов
— Нужно быстро найти крэш или баг прямо на реальном устройстве
— Хотите дебажить только свою часть логов, а не весь Android-спам
— Проверяете работу логирования перед релизом
Добавьте уровни логов для фильтрации:
adb logcat *:E # только ошибки
adb logcat *:W # предупреждения и выше
adb logcat в работе?#буст #JuniorKit #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2
Чтобы быстрее освоиться в Android Studio, держи подборку полезных сочетаний клавиш (Windows/Linux → Mac в скобках):
Ctrl + Shift + F (Cmd + Shift + F)Найдёшь любой фрагмент кода во всём проекте.
Ctrl + N (Cmd + O)Откроешь нужный класс по имени без лишней навигации.
Ctrl + Alt + L (Cmd + Option + L)Приводит код к читаемому виду по стилю проекта.
Ctrl + Space (Ctrl + Space)Экономит время, подсказывает методы и переменные.
Shift + F10 (Ctrl + R)Мгновенный запуск на эмуляторе или подключённом устройстве.
Освоив эти комбинации, ты будешь писать и навигироваться по проекту заметно быстрее
#буст #JuniorKit #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Пишите свои ответы в комментариях
#междусобойчик #JuniorKit
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
adb shell dumpsys package – детальная информация об установленном приложенииПолучайте полную техническую информацию о любом установленном приложении на Android-устройстве – от версий и разрешений до активности процессов.
1. Информация о версиях:
adb shell dumpsys package com.yourapp.package | grep -E "versionName|versionCode"
2. Проверка разрешений:
adb shell dumpsys package com.yourapp.package | grep -A 20 "requested permissions"
3. Информация о активностях и сервисах:
adb shell dumpsys package com.yourapp.package | grep -E "Activity|Service|Receiver"
4. Детали установки APK:
adb shell dumpsys package com.yourapp.package | grep -A 10 "Installation"
1. Только основные данные:
adb shell dumpsys package com.yourapp.package | head -50
2. Поиск конкретной активности:
adb shell dumpsys package com.yourapp.package | grep -B 5 -A 5 "MainActivity"
3. Информация о подписантах:
adb shell dumpsys package com.yourapp.package | grep -A 15 "Signatures"
dumpsys для отладки? Какие еще параметры dumpsys вам полезны?#буст #JuniorKit #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Оператор
guard используется для передачи управления программой за пределы области видимости. Оператор guard похож на оператор if, но он запускается только тогда, когда некоторые условия не выполняются.Например, оператор
guard используется для выхода из функции:func myFun() {
guard false else {
print("This block is run")
return
}
print("This is never run")
}
myFun()Вывод:
This block is run
#буст #JuniorKit #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
reified — это ключевое слово, которое может быть использовано только в inline-функциях.
reified позволяет получить информацию о типе generic-параметра во время выполнения программы. В обычном случае, информация о типах стирается и недоступна во время выполнения, но с помощью reified можно сохранять эту информацию и использовать в других частях приложения.Несколько простых примеров применения:
1. Получить доступ к типу параметра во время выполнения
fun main() {
printType<String>() // String
printType<Int>() // Int
}
private inline fun <reified T> printType() {
println(T::class.simpleName)
}В этом примере мы определяем функцию
printType() с типовым параметром T, который мы указываем с помощью reified. Внутри функции мы можем получить тип T во время выполнения, используя T::class. Затем выводим название типа на экран с помощью simpleName. Когда мы вызываем функцию printType() с типом String или Int, она выводит соответствующий тип на экран.2.
reified вместе с is для проверки типа аргумента во время выполненияfun main() {
println(isOfType<Int>(1)) // true
println(isOfType<Int>("Hello")) // false
}
private inline fun <reified T> isOfType(value: Any): Boolean {
return value is T
}Здесь мы определяем функцию
isOfType(), которая принимает значение типа Any и возвращает true, если оно является типом T. Мы используем reified, чтобы получить доступ к типу T во время выполнения. Затем мы используем оператор is для проверки типа значения и возвращаем соответствующее boolean значение.3. Получить список элементов перечисления
enum class Color { RED, GREEN, BLUE }
fun main() {
printEnumValues<Color>() // RED, GREEN, BLUE
}
private inline fun <reified T : Enum<T>> printEnumValues() {
enumValues<T>().forEach { value ->
println(value)
}
}Определяем функцию
printEnumValues(), которая выводит список элементов перечисления типа T. Мы применяем reified, чтобы получить доступ к типу T во время выполнения. Затем используем enumValues<T>(), чтобы получить список всех значений перечисления типа T. Внутри цикла выводим каждое значение на экран. Когда мы вызываем функцию printEnumValues() с типом Color, она выводит "RED", "GREEN" и "BLUE" в консоль.#буст #JuniorKit #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
В Jetpack Compose не рекомендуется напрямую вызывать не-компонуемые функции внутри composable-функций.
Вместо этого, чтобы безопасно выполнять операции вроде запуска корутин, вызова побочных эффектов или обработки логики, зависящей от жизненного цикла, используются обработчики эффектов (effect handlers).
Эти обработчики позволяют безопасно взаимодействовать с внешним миром (сеть, база данных, логи и т. д.) в контролируемом виде.
Ниже приведены самые распространённые обработчики эффектов в Compose — просто и с примерами.
🔹
SideEffectВыполняет логику после каждого успешного пересоздания (recomposition).
SideEffect {
Log.d("TAG", "Recomposition completed")
}Подходит для логирования, аналитики или любых операций, которые должны выполняться после отрисовки интерфейса.
🔹
LaunchedEffectЗапускает корутину, когда изменяется указанный ключ. Если происходит пересоздание и ключ меняется — предыдущая корутина отменяется, и запускается новая.
LaunchedEffect(key1 = someState) {
fetchData()
}Идеально подходит для вызова API или выполнения логики, зависящей от изменяющегося состояния.
🔹
rememberCoroutineScopeПредоставляет область действия корутины, которая сохраняется между пересозданиями. Лучше всего использовать, когда нужно запускать корутины в ответ на действия пользователя (например, нажатие кнопки).
val coroutineScope = rememberCoroutineScope()
Button(onClick = {
coroutineScope.launch {
doSomething()
}
}) {
Text("Click me")
}
Для событий, инициируемых пользователем, которые не зависят напрямую от состояния или жизненного цикла.
🔹
DisposableEffectВыполняет код при входе в композицию и очищает ресурсы при выходе из неё.
DisposableEffect(key1 = someKey) {
startListening() onDispose {
stopListening()
}
}Добавление или удаление слушателей, наблюдателей, освобождение внешних ресурсов и другая логика очистки.
#буст #JuniorKit #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Когда несколько корутин обращаются к общим данным или ресурсам одновременно, возникает риск гонок данных (race conditions).
Mutex (mutual exclusion) — это инструмент синхронизации, который помогает управлять доступом к общим ресурсам, гарантируя, что в один момент времени их изменяет только одна корутина.
Вот самые частые примеры, когда Mutex действительно нужен:
Самый распространённый случай — безопасный доступ к общей переменной:
class CounterService {
private var counter = 0
private val mutex = Mutex()
suspend fun increment() {
mutex.withLock {
counter++
}
}
suspend fun getCount(): Int {
return mutex.withLock {
counter
}
}
}Когда несколько корутин должны поочерёдно работать с общим ресурсом:
class FileWriter(private val file: File) {
private val mutex = Mutex()
suspend fun appendLine(line: String) {
mutex.withLock {
file.appendText("$line\n")
}
}
}Когда операции должны выполняться строго по порядку, даже если запущены одновременно:
class OrderProcessor {
private val mutex = Mutex()
private val orders = mutableListOf<Order>()
suspend fun processOrder(order: Order) {
mutex.withLock {
// Обеспечиваем последовательную обработку заказов
orders.add(order)
validateOrder(order)
persistOrder(order)
}
}
}Обеспечивает безопасную инициализацию ресурса в асинхронных контекстах:
class DatabaseConnection {
private var connection: Connection? = null
private val mutex = Mutex()
suspend fun getConnection(): Connection {
if (connection != null) return connection!!
return mutex.withLock {
// Повторная проверка внутри блокировки
connection ?: createConnection().also { connection = it }
}
}
private suspend fun createConnection(): Connection {
delay(1000) // Симуляция установки соединения
return Connection()
}
}#АрхитектурныйКод #JuniorKit #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1