Зачем нужны Data Class и Sealed Classes ?
Спросят с вероятностью 13%
Data Class и Sealed Class решают разные задачи и обеспечивают улучшения в организации кода, управлении состоянием и безопасности типов. Они вносят значительные упрощения и повышают читаемость кода в Kotlin-проектах.
Зачем они нужны
Data Class предназначены для хранения данных и автоматически предоставляют ряд полезных методов, что упрощает разработку и уменьшает объем шаблонного кода. Основные причины использования Data Class:
1️⃣Сокращение кода: Автоматически генерирует методы
2️⃣Упрощение передачи данных: Идеально подходят для передачи данных между различными частями приложения, например, между слоями в архитектуре MVVM или при передаче данных между активностями и фрагментами.
3️⃣Поддержка неизменяемости: С помощью них легко создавать неизменяемые объекты, что способствует безопасной работе с данными, особенно в многопоточной среде.
Зачем они нужны
Sealed Class используются для определения закрытых иерархий классов, где все потомки известны и ограничены. Они полезны по следующим причинам:
1️⃣Полное покрытие случаев в `when`: Гарантируют, что все возможные подтипы обработаны в выражениях
2️⃣Ограниченное наследование: Ограничивают возможность создания подклассов за пределами файла, в котором они объявлены. Это предотвращает неожиданное наследование и сохраняет иерархию классов контролируемой и понятной.
3️⃣Инкапсуляция: Поскольку все расширения таких классов должны быть объявлены в том же файле, это способствует лучшей инкапсуляции и организации кода.
Пример:
Пример Sealed Class:
Использование Data Class и Sealed Classes значительно улучшает структуру кода, повышает его безопасность и упрощает многие задачи связанные с обработкой данных и управлением состоянием приложений. Эти особенности делают Kotlin особенно привлекательным для разработчиков, стремящихся писать консистентный, безопасный и легко поддерживаемый код.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Data Class и Sealed Class решают разные задачи и обеспечивают улучшения в организации кода, управлении состоянием и безопасности типов. Они вносят значительные упрощения и повышают читаемость кода в Kotlin-проектах.
Зачем они нужны
Data Class предназначены для хранения данных и автоматически предоставляют ряд полезных методов, что упрощает разработку и уменьшает объем шаблонного кода. Основные причины использования Data Class:
1️⃣Сокращение кода: Автоматически генерирует методы
equals(), hashCode(), и toString(), а также copy() и компонентные функции для объектов данных. Это избавляет от необходимости ручной реализации этих методов, что уменьшает количество кода и возможность ошибок.2️⃣Упрощение передачи данных: Идеально подходят для передачи данных между различными частями приложения, например, между слоями в архитектуре MVVM или при передаче данных между активностями и фрагментами.
3️⃣Поддержка неизменяемости: С помощью них легко создавать неизменяемые объекты, что способствует безопасной работе с данными, особенно в многопоточной среде.
Зачем они нужны
Sealed Class используются для определения закрытых иерархий классов, где все потомки известны и ограничены. Они полезны по следующим причинам:
1️⃣Полное покрытие случаев в `when`: Гарантируют, что все возможные подтипы обработаны в выражениях
when, что предотвращает ошибки во время выполнения из-за пропущенных случаев. Это упрощает управление состояниями и делает код более безопасным и предсказуемым.2️⃣Ограниченное наследование: Ограничивают возможность создания подклассов за пределами файла, в котором они объявлены. Это предотвращает неожиданное наследование и сохраняет иерархию классов контролируемой и понятной.
3️⃣Инкапсуляция: Поскольку все расширения таких классов должны быть объявлены в том же файле, это способствует лучшей инкапсуляции и организации кода.
Пример:
data class User(val name: String, val age: Int)
Пример Sealed Class:
sealed class Result {
data class Success(val data: String) : Result()
data class Failure(val error: Throwable) : Result()
}
fun handleResult(result: Result) {
when (result) {
is Result.Success -> println("Success with data: ${result.data}")
is Result.Failure -> println("Failure with error: ${result.error.message}")
}
}Использование Data Class и Sealed Classes значительно улучшает структуру кода, повышает его безопасность и упрощает многие задачи связанные с обработкой данных и управлением состоянием приложений. Эти особенности делают Kotlin особенно привлекательным для разработчиков, стремящихся писать консистентный, безопасный и легко поддерживаемый код.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍2
Бывают ли случаи, когда нельзя использовать inline ?
Спросят с веротяностью 20%
Существуют ситуации, когда использование
Основные случаи, когда использование
1️⃣Большой объём кода функции: Встраивание больших функций может привести к значительному увеличению размера скомпилированного кода (эффект раздувания кода), так как код функции будет скопирован во все места её вызова. Это может негативно сказаться на производительности и времени загрузки приложения. В таких случаях лучше избегать встраивания.
2️⃣Рекурсивные функции: Непосредственное встраивание рекурсивных функций невозможно, поскольку это приведёт к бесконечному циклу встраивания кода функции в себя же. Однако существуют способы обхода, например, можно встроить часть функции, используя локальные
3️⃣Виртуальные функции или функции интерфейса: Методы, которые являются частью интерфейса или виртуальные методы в классах (то есть методы, которые могут быть переопределены в подклассах), не могут быть объявлены как
4️⃣Вызовы внутри `inline` функций, которые не могут быть встроены: Если в теле
5️⃣Ограничения платформы или среды выполнения: В некоторых случаях ограничения целевой платформы или среды выполнения могут налагать ограничения на использование встраивания. Например, при компиляции Kotlin в JavaScript или другие целевые платформы могут существовать специфические ограничения, связанные с встраиванием кода.
Хотя
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с веротяностью 20%
Существуют ситуации, когда использование
inline модификатора может быть неприемлемым или невозможным. Данные функции — это мощный инструмент, который позволяет избежать накладных расходов на вызовы функций высшего порядка за счёт встраивания их кода в места вызова. Однако его использование имеет как преимущества, так и потенциальные недостатки или ограничения.Основные случаи, когда использование
inline может быть нежелательным или невозможным:1️⃣Большой объём кода функции: Встраивание больших функций может привести к значительному увеличению размера скомпилированного кода (эффект раздувания кода), так как код функции будет скопирован во все места её вызова. Это может негативно сказаться на производительности и времени загрузки приложения. В таких случаях лучше избегать встраивания.
2️⃣Рекурсивные функции: Непосредственное встраивание рекурсивных функций невозможно, поскольку это приведёт к бесконечному циклу встраивания кода функции в себя же. Однако существуют способы обхода, например, можно встроить часть функции, используя локальные
inline функции для рекурсивных вызовов.3️⃣Виртуальные функции или функции интерфейса: Методы, которые являются частью интерфейса или виртуальные методы в классах (то есть методы, которые могут быть переопределены в подклассах), не могут быть объявлены как
inline. Встраивание подразумевает статическое разрешение вызываемой функции во время компиляции, что невозможно для виртуальных функций, требующих динамического разрешения во время выполнения.4️⃣Вызовы внутри `inline` функций, которые не могут быть встроены: Если в теле
inline функции происходит вызов других функций, которые не могут быть встроены (например, виртуальных функций), эти вызовы будут обрабатываться как обычные, не встраиваемые. Это может снизить эффективность использования inline.5️⃣Ограничения платформы или среды выполнения: В некоторых случаях ограничения целевой платформы или среды выполнения могут налагать ограничения на использование встраивания. Например, при компиляции Kotlin в JavaScript или другие целевые платформы могут существовать специфические ограничения, связанные с встраиванием кода.
Хотя
inline функции являются мощным инструментом для оптимизации производительности Kotlin-приложений, особенно при работе с функциями высшего порядка, их использование требует понимания потенциальных ограничений и недостатков. Важно оценивать целесообразность его применения в каждом конкретном случае, чтобы избежать негативного влияния на размер и производительность приложения.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍3
Что такое Data Class и Sealed Classes ?
Спросят с вероятностью 13%
Data Class — Это специальный тип класса, предназначенный для хранения данных. Основная цель таких классов — содержать данные и не выполнять никакой дополнительной логики. Для объявления используется ключевое слово
Особенности data class:
1️⃣Автоматическая генерация методов: Kotlin автоматически генерирует методы
2️⃣Использование: Data class широко используется для передачи данных между компонентами программы, в моделях MVC или MVVM, в DTO (Data Transfer Objects) и POJO (Plain Old Java Object) в Java-экосистеме.
Пример:
Sealed Class
Это класс, который ограничивает возможность наследования. Другими словами, такие классы позволяют определять ограниченные иерархии классов, где все возможные подклассы известны во время компиляции. Это особенно полезно в сочетании с паттерном
Особенности:
1️⃣Ограниченное наследование: Все подклассы данного класса должны быть объявлены в том же файле, что и sealed класс.
2️⃣Использование с `when`: Идеально подходят для использования в выражениях
Пример:
✅Data class используется для хранения данных и предоставляет автоматически сгенерированные методы для удобной работы с объектами.
✅Sealed class обеспечивает безопасное использование ограниченных иерархий, что позволяет более строго управлять наследованием и использованием классов, особенно в
Оба типа классов повышают выразительность и читаемость кода, уменьшают вероятность ошибок и упрощают ряд задач.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Data Class — Это специальный тип класса, предназначенный для хранения данных. Основная цель таких классов — содержать данные и не выполнять никакой дополнительной логики. Для объявления используется ключевое слово
data.Особенности data class:
1️⃣Автоматическая генерация методов: Kotlin автоматически генерирует методы
equals(), hashCode(), и toString(), а также copy() и компонентные функции (componentN()), которые облегчают работу с объектами.2️⃣Использование: Data class широко используется для передачи данных между компонентами программы, в моделях MVC или MVVM, в DTO (Data Transfer Objects) и POJO (Plain Old Java Object) в Java-экосистеме.
Пример:
data class User(val name: String, val age: Int)
Sealed Class
Это класс, который ограничивает возможность наследования. Другими словами, такие классы позволяют определять ограниченные иерархии классов, где все возможные подклассы известны во время компиляции. Это особенно полезно в сочетании с паттерном
when, так как компилятор может проверить, обработаны ли все возможные случаи.Особенности:
1️⃣Ограниченное наследование: Все подклассы данного класса должны быть объявлены в том же файле, что и sealed класс.
2️⃣Использование с `when`: Идеально подходят для использования в выражениях
when, поскольку Kotlin знает все возможные подклассы и может гарантировать, что все случаи обработаны.Пример:
sealed class Payment {
data class Cash(val amount: Int) : Payment()
data class CreditCard(val number: String, val code: Int) : Payment()
object GiftCard : Payment()
}
fun processPayment(payment: Payment) {
when (payment) {
is Payment.Cash -> println("Cash payment of ${payment.amount}")
is Payment.CreditCard -> println("Credit card payment with number ${payment.number}")
is Payment.GiftCard -> println("Gift card used")
}
}✅Data class используется для хранения данных и предоставляет автоматически сгенерированные методы для удобной работы с объектами.
✅Sealed class обеспечивает безопасное использование ограниченных иерархий, что позволяет более строго управлять наследованием и использованием классов, особенно в
when выражениях, что улучшает поддерживаемость и безопасность кода.Оба типа классов повышают выразительность и читаемость кода, уменьшают вероятность ошибок и упрощают ряд задач.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍3
Что такое миграция и для чего она нужна ?
Спросят с вероятностью 13%
Миграция в контексте ПО и баз данных относится к процессу переноса данных, приложений или других элементов из одной среды в другую, или к изменениям в структуре баз данных, кода или технологии без потери данных или функциональности. Может включать в себя различные аспекты, такие как миграция серверов, миграция баз данных, миграция приложений и миграция данных. Она необходима по множеству причин, включая улучшение производительности, масштабирование, обновление систем и интеграцию новых функций.
Миграция данных
Один из наиболее частых сценариев — это миграция данных между разными базами данных или версиями баз данных. Это особенно актуально при обновлениях программного обеспечения или переходе на более мощное и современное решение для хранения данных.
Цели включают:
✅Обновление инфраструктуры: Переход на более современную или мощную систему хранения данных для улучшения производительности и расширяемости.
✅Консолидация данных: Слияние данных из разных источников в одну централизованную базу данных для упрощения управления и анализа.
✅Соответствие стандартам: Обновление систем для соответствия новым стандартам безопасности или правилам обработки данных.
✅Снижение затрат: Миграция на более экономичные решения для сокращения расходов на обслуживание старых систем.
Миграция схемы базы данных
Необходима при изменениях в структуре базы данных, которые требуются по мере развития и изменения приложений. Это может включать добавление новых таблиц, изменение существующих таблиц, добавление индексов или любые другие модификации, которые улучшат работу приложения или адаптируют его под новые требования.
Процесс:
✅Планирование: Определение изменений, которые нужно внести, и стратегии миграции без простоя или потери данных.
✅Разработка: Кодирование новой схемы и миграционных скриптов.
✅Тестирование: Обширное тестирование миграционных скриптов в тестовой среде для убедительности в их корректности.
✅Выполнение: Применение миграции в производственной среде, часто с минимальным простоем.
Инструменты:
Существует множество инструментов, которые могут помочь в процессе миграции данных или схемы, включая:
✅Для баз данных: Инструменты вроде Liquibase и Flyway предоставляют управляемые подходы к миграции схем баз данных, поддерживая версионность и откат изменений.
✅Для приложений: Платформы, такие как AWS Database Migration Service (DMS) или Google Cloud’s Database Migration Service, помогают в миграции данных между различными базами данных, в том числе между разными облачными провайдерами или из локальных систем в облако.
Миграция — это критически важный процесс, который помогает компаниям оставаться на переднем крае технологий, улучшать производительность, сокращать расходы и соответствовать текущим бизнес-требованиям и нормативам. Планирование, тестирование и выполнение миграции требуют тщательного подхода и часто специализированных инструментов для минимизации рисков и обеспечения успешного перехода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Миграция в контексте ПО и баз данных относится к процессу переноса данных, приложений или других элементов из одной среды в другую, или к изменениям в структуре баз данных, кода или технологии без потери данных или функциональности. Может включать в себя различные аспекты, такие как миграция серверов, миграция баз данных, миграция приложений и миграция данных. Она необходима по множеству причин, включая улучшение производительности, масштабирование, обновление систем и интеграцию новых функций.
Миграция данных
Один из наиболее частых сценариев — это миграция данных между разными базами данных или версиями баз данных. Это особенно актуально при обновлениях программного обеспечения или переходе на более мощное и современное решение для хранения данных.
Цели включают:
✅Обновление инфраструктуры: Переход на более современную или мощную систему хранения данных для улучшения производительности и расширяемости.
✅Консолидация данных: Слияние данных из разных источников в одну централизованную базу данных для упрощения управления и анализа.
✅Соответствие стандартам: Обновление систем для соответствия новым стандартам безопасности или правилам обработки данных.
✅Снижение затрат: Миграция на более экономичные решения для сокращения расходов на обслуживание старых систем.
Миграция схемы базы данных
Необходима при изменениях в структуре базы данных, которые требуются по мере развития и изменения приложений. Это может включать добавление новых таблиц, изменение существующих таблиц, добавление индексов или любые другие модификации, которые улучшат работу приложения или адаптируют его под новые требования.
Процесс:
✅Планирование: Определение изменений, которые нужно внести, и стратегии миграции без простоя или потери данных.
✅Разработка: Кодирование новой схемы и миграционных скриптов.
✅Тестирование: Обширное тестирование миграционных скриптов в тестовой среде для убедительности в их корректности.
✅Выполнение: Применение миграции в производственной среде, часто с минимальным простоем.
Инструменты:
Существует множество инструментов, которые могут помочь в процессе миграции данных или схемы, включая:
✅Для баз данных: Инструменты вроде Liquibase и Flyway предоставляют управляемые подходы к миграции схем баз данных, поддерживая версионность и откат изменений.
✅Для приложений: Платформы, такие как AWS Database Migration Service (DMS) или Google Cloud’s Database Migration Service, помогают в миграции данных между различными базами данных, в том числе между разными облачными провайдерами или из локальных систем в облако.
Миграция — это критически важный процесс, который помогает компаниям оставаться на переднем крае технологий, улучшать производительность, сокращать расходы и соответствовать текущим бизнес-требованиям и нормативам. Планирование, тестирование и выполнение миграции требуют тщательного подхода и часто специализированных инструментов для минимизации рисков и обеспечения успешного перехода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍2
Какие сущности описываются в Manifest ?
Спросят с веротяностью 20%
Файл
Компоненты приложения
✅Activity (`<activity>`): Определяет экраны в приложении (интерфейсы), с которыми пользователь может взаимодействовать. Каждая активность должна быть объявлена в манифесте.
✅Service (`<service>`): Описывает долгосрочные операции, которые не требуют взаимодействия с пользователем. Сервисы могут работать в фоновом режиме, даже когда пользователь не взаимодействует с приложением.
✅Broadcast Receiver (`<receiver>`): Позволяет приложению регистрировать события или сообщения из других приложений или системы (например, уведомление о низком заряде батареи).
✅Content Provider (`<provider>`): Управляет доступом к структурированным данным. Обычно используется для чтения и записи данных, которыми приложение делится с другими приложениями.
Конфигурация приложения
✅Права доступа (`<uses-permission>`): Заявляет о разрешениях, которые требуются приложению для работы с определенными функциями или данными на устройстве (например, доступ к интернету, камере, контактам).
✅Особенности устройства (`<uses-feature>`): Указывает на аппаратные и программные особенности, которые требуются или используются приложением (например, наличие камеры, NFC). Это помогает Google Play определить, совместимо ли приложение с устройством пользователя.
✅Совместимость с версиями SDK (`<uses-sdk>`): Определяет минимальную и целевую версию Android SDK, с которой совместимо приложение. Это важно для обеспечения правильного поведения приложения на различных версиях Android.
✅Метаданные (`<meta-data>`): Предоставляет дополнительную информацию для конфигурации компонентов приложения или плагинов, таких как сервисы Google Play.
Интент-фильтры (
Объявляются внутри компонентов и определяют типы интентов, которые компонент может принимать. Это позволяет, например, активности быть запущенной через определенные действия, такие как просмотр веб-страницы или открытие изображения.
Другие элементы
✅Защита данных (`<permission>`): Определяет пользовательские разрешения для контроля доступа к данным или функциям приложения.
✅Алиасы активностей (`<activity-alias>`): Позволяет объявить псевдоним для активности для управления, как она запускается.
Файл
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с веротяностью 20%
Файл
AndroidManifest.xml играет критически важную роль, поскольку он действует как своего рода декларативный "мозг" приложения. В этом файле описываются основные компоненты приложения, его возможности, требуемые разрешения и другие настройки, которые операционная система должна знать, чтобы правильно запускать приложение и взаимодействовать с ним. Вот основные сущности, которые обычно описываются здесь:Компоненты приложения
✅Activity (`<activity>`): Определяет экраны в приложении (интерфейсы), с которыми пользователь может взаимодействовать. Каждая активность должна быть объявлена в манифесте.
✅Service (`<service>`): Описывает долгосрочные операции, которые не требуют взаимодействия с пользователем. Сервисы могут работать в фоновом режиме, даже когда пользователь не взаимодействует с приложением.
✅Broadcast Receiver (`<receiver>`): Позволяет приложению регистрировать события или сообщения из других приложений или системы (например, уведомление о низком заряде батареи).
✅Content Provider (`<provider>`): Управляет доступом к структурированным данным. Обычно используется для чтения и записи данных, которыми приложение делится с другими приложениями.
Конфигурация приложения
✅Права доступа (`<uses-permission>`): Заявляет о разрешениях, которые требуются приложению для работы с определенными функциями или данными на устройстве (например, доступ к интернету, камере, контактам).
✅Особенности устройства (`<uses-feature>`): Указывает на аппаратные и программные особенности, которые требуются или используются приложением (например, наличие камеры, NFC). Это помогает Google Play определить, совместимо ли приложение с устройством пользователя.
✅Совместимость с версиями SDK (`<uses-sdk>`): Определяет минимальную и целевую версию Android SDK, с которой совместимо приложение. Это важно для обеспечения правильного поведения приложения на различных версиях Android.
✅Метаданные (`<meta-data>`): Предоставляет дополнительную информацию для конфигурации компонентов приложения или плагинов, таких как сервисы Google Play.
Интент-фильтры (
<intent-filter>)Объявляются внутри компонентов и определяют типы интентов, которые компонент может принимать. Это позволяет, например, активности быть запущенной через определенные действия, такие как просмотр веб-страницы или открытие изображения.
Другие элементы
✅Защита данных (`<permission>`): Определяет пользовательские разрешения для контроля доступа к данным или функциям приложения.
✅Алиасы активностей (`<activity-alias>`): Позволяет объявить псевдоним для активности для управления, как она запускается.
Файл
AndroidManifest.xml несет в себе важнейшую информацию, которая позволяет системе правильно работать с приложением, и является обязательной частью любого Android проекта.👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍3
Anonymous Quiz
5%
var number: Int = 5
92%
val number: Int = 5
1%
let number: Int = 5
3%
immutable number: Int = 5
Что такое Data Class ?
Спросят с вероятностью 13%
"Data Class" относится к классам, которые в основном используются для хранения данных. Эти классы часто содержат лишь поля данных и методы для доступа к этим данным (геттеры и сеттеры), и мало или вообще не содержат другой бизнес-логики. Применение таких классов широко распространено в различных языках, включая Java, Kotlin, C# и другие, но они могут иметь некоторые специфические особенности в зависимости от языка.
Data Class
Kotlin особенно выделяется своей поддержкой data class за счёт предоставления встроенной поддержки шаблонных методов, упрощающих работу с такими классами. Ключевое слово
Пример data class:
В этом примере, для класса
✅Метод
✅Метод
✅Метод
✅Метод
✅Компонентные функции (
Зачем его использовать
Использование data classes упрощает создание моделей данных в приложениях и способствует написанию чистого, организованного и легко тестируемого кода. Эти классы позволяют быстро определять структуры данных, обеспечивать их неизменяемость (immutability) и упрощать работу с ними благодаря автоматически генерируемым методам. Data classes особенно полезны в приложениях, где нужно часто передавать данные между компонентами или использовать их в коллекциях.
Data class — это удобный способ для структурирования и управления данными в приложении, позволяющий сократить шаблонный код и улучшить читаемость и поддерживаемость кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
"Data Class" относится к классам, которые в основном используются для хранения данных. Эти классы часто содержат лишь поля данных и методы для доступа к этим данным (геттеры и сеттеры), и мало или вообще не содержат другой бизнес-логики. Применение таких классов широко распространено в различных языках, включая Java, Kotlin, C# и другие, но они могут иметь некоторые специфические особенности в зависимости от языка.
Data Class
Kotlin особенно выделяется своей поддержкой data class за счёт предоставления встроенной поддержки шаблонных методов, упрощающих работу с такими классами. Ключевое слово
data сообщает компилятору, что класс предназначен для хранения данных. Он автоматически генерирует ряд полезных методов, включая equals(), hashCode(), и toString(), а также методы для копирования объектов и компонентные функции для деструктуризации объекта.Пример data class:
data class User(val name: String, val age: Int)
В этом примере, для класса
User Kotlin автоматически сгенерирует:✅Метод
equals() для сравнения экземпляров User по значениям полей,✅Метод
hashCode() для генерации хеш-кода на основе значений полей,✅Метод
toString() для создания строкового представления экземпляра,✅Метод
copy() для создания нового экземпляра с теми же или измененными значениями,✅Компонентные функции (
componentN()), которые позволяют деструктуризировать объект.Зачем его использовать
Использование data classes упрощает создание моделей данных в приложениях и способствует написанию чистого, организованного и легко тестируемого кода. Эти классы позволяют быстро определять структуры данных, обеспечивать их неизменяемость (immutability) и упрощать работу с ними благодаря автоматически генерируемым методам. Data classes особенно полезны в приложениях, где нужно часто передавать данные между компонентами или использовать их в коллекциях.
Data class — это удобный способ для структурирования и управления данными в приложении, позволяющий сократить шаблонный код и улучшить читаемость и поддерживаемость кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍2❤1
Для чего нужен Dagger ?
Спросят с вероятностью 13%
Dagger — это популярный фреймворк для внедрения зависимостей (Dependency Injection, DI). Внедрение зависимостей — это техника, предназначенная для упрощения управления зависимостями между объектами в программировании. Помогает автоматизировать этот процесс, управляя созданием объектов и их жизненным циклом. Основной его целью является уменьшение связности компонентов приложения, что упрощает их тестирование и поддержку.
Основные причины его использования:
1️⃣Уменьшение связности кода: Снижает зависимость между компонентами программы, делая их более модульными и упрощая замену одних компонентов другими. Это особенно полезно при тестировании, когда необходимо заменить реальные зависимости на моки (заглушки).
2️⃣Улучшение управления жизненным циклом объектов: Управляет созданием объектов и может интегрироваться с жизненным циклом приложения, особенно в Android. Это позволяет более эффективно управлять ресурсами и предотвращать утечки памяти.
3️⃣Автоматизация процесса внедрения: Использует аннотации для автоматизации процесса внедрения зависимостей, что снижает количество шаблонного кода. Не нужно вручную создавать и связывать зависимые объекты, что упрощает разработку и поддержку кода.
4️⃣Компиляционная безопасность: Поскольку он генерирует код внедрения зависимостей во время компиляции, он обеспечивает безопасность на уровне компиляции. Это означает, что большинство ошибок связанных с зависимостями, будет обнаружено до запуска приложения.
5️⃣Масштабируемость: С ним легче управлять большими и сложными системами зависимостей, что делает его идеальным инструментом для крупных проектов.
Как он работает:
Работает на основе компилятора, который генерирует необходимый код для внедрения зависимостей на основе аннотаций, указанных в коде.
В этом примере Dagger автоматически создает объект
Использование Dagger значительно упрощает управление зависимостями, улучшает архитектуру приложения и повышает его тестируемость и модульность. Предоставляет мощный инструментарий для разработчиков, стремящихся к созданию чистого, эффективного и легко поддерживаемого кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Dagger — это популярный фреймворк для внедрения зависимостей (Dependency Injection, DI). Внедрение зависимостей — это техника, предназначенная для упрощения управления зависимостями между объектами в программировании. Помогает автоматизировать этот процесс, управляя созданием объектов и их жизненным циклом. Основной его целью является уменьшение связности компонентов приложения, что упрощает их тестирование и поддержку.
Основные причины его использования:
1️⃣Уменьшение связности кода: Снижает зависимость между компонентами программы, делая их более модульными и упрощая замену одних компонентов другими. Это особенно полезно при тестировании, когда необходимо заменить реальные зависимости на моки (заглушки).
2️⃣Улучшение управления жизненным циклом объектов: Управляет созданием объектов и может интегрироваться с жизненным циклом приложения, особенно в Android. Это позволяет более эффективно управлять ресурсами и предотвращать утечки памяти.
3️⃣Автоматизация процесса внедрения: Использует аннотации для автоматизации процесса внедрения зависимостей, что снижает количество шаблонного кода. Не нужно вручную создавать и связывать зависимые объекты, что упрощает разработку и поддержку кода.
4️⃣Компиляционная безопасность: Поскольку он генерирует код внедрения зависимостей во время компиляции, он обеспечивает безопасность на уровне компиляции. Это означает, что большинство ошибок связанных с зависимостями, будет обнаружено до запуска приложения.
5️⃣Масштабируемость: С ним легче управлять большими и сложными системами зависимостей, что делает его идеальным инструментом для крупных проектов.
Как он работает:
Работает на основе компилятора, который генерирует необходимый код для внедрения зависимостей на основе аннотаций, указанных в коде.
// Определение зависимости
public class Engine {
@Inject
Engine() {
}
}
// Компонент, указывающий на необходимость предоставления зависимости
@Component
public interface VehicleComponent {
Vehicle buildVehicle();
}
// Класс, в который необходимо внедрить зависимость
public class Vehicle {
private Engine engine;
@Inject
Vehicle(Engine engine) {
this.engine = engine;
}
}
// Использование Dagger для создания объекта
public class MainApplication {
public static void main(String[] args) {
VehicleComponent component = DaggerVehicleComponent.create();
Vehicle vehicle = component.buildVehicle();
}
}
В этом примере Dagger автоматически создает объект
Engine и внедряет его в Vehicle при создании экземпляра Vehicle через компонент VehicleComponent.Использование Dagger значительно упрощает управление зависимостями, улучшает архитектуру приложения и повышает его тестируемость и модульность. Предоставляет мощный инструментарий для разработчиков, стремящихся к созданию чистого, эффективного и легко поддерживаемого кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍3
Что такое Garbage Collector Roots ?
Спросят с веротяностью 20%
Garbage Collector (GC) Roots в контексте сборки мусора представляют собой набор объектов, которые используются в качестве отправных точек для алгоритма сборки мусора при его попытке определить, какие объекты в памяти доступны (доступные для использования) и какие нет (и, следовательно, могут быть удалены). Сборщик мусора сканирует объекты, начиная с этих корней, для определения достижимых объектов. Объект считается достижимым, если он может быть доступен из любого из GC Roots через любое количество ссылок.
Garbage Collector Roots можно классифицировать по следующим категориям:
1️⃣Локальные переменные и параметры методов
Локальные переменные и параметры методов в стеке вызовов текущих потоков. Поскольку они могут быть напрямую доступны во время выполнения кода, они служат важными корнями для сборки мусора.
2️⃣Активные потоки
Объект потока (Thread) сам по себе может быть корнем сборки мусора, так как активные потоки и их стеки вызовов могут ссылаться на другие объекты.
3️⃣Статические поля
Статические переменные классов также считаются корнями GC, поскольку они доступны в течение всего времени выполнения программы, начиная с момента их загрузки класслоадером и до окончания работы приложения.
4️⃣JNI (Java Native Interface) ссылки
Объекты, на которые ссылаются из нативного кода через JNI, также являются корнями, так как они могут быть использованы внешним нативным кодом и не должны удаляться, пока такие ссылки существуют.
GC Roots играют ключевую роль в процессе сборки мусора, так как они определяют отправную точку для поиска объектов, которые должны остаться в памяти. Сборщик мусора использует эти корни для обхода всех достижимых объектов. Любой объект, который не может быть достигнут при обходе от корней, считается недостижимым и, следовательно, кандидатом на удаление, так как он больше не используется приложением.
Эффективность работы сборщика мусора и управление памятью в приложении зависят от того, как быстро и эффективно могут быть идентифицированы недостижимые объекты. Утечки памяти могут возникнуть, если объекты, которые должны были быть удалены, по-прежнему достижимы из-за ненужных ссылок, сохраняемых в GC Roots, делая их недоступными для сборки мусора.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с веротяностью 20%
Garbage Collector (GC) Roots в контексте сборки мусора представляют собой набор объектов, которые используются в качестве отправных точек для алгоритма сборки мусора при его попытке определить, какие объекты в памяти доступны (доступные для использования) и какие нет (и, следовательно, могут быть удалены). Сборщик мусора сканирует объекты, начиная с этих корней, для определения достижимых объектов. Объект считается достижимым, если он может быть доступен из любого из GC Roots через любое количество ссылок.
Garbage Collector Roots можно классифицировать по следующим категориям:
1️⃣Локальные переменные и параметры методов
Локальные переменные и параметры методов в стеке вызовов текущих потоков. Поскольку они могут быть напрямую доступны во время выполнения кода, они служат важными корнями для сборки мусора.
2️⃣Активные потоки
Объект потока (Thread) сам по себе может быть корнем сборки мусора, так как активные потоки и их стеки вызовов могут ссылаться на другие объекты.
3️⃣Статические поля
Статические переменные классов также считаются корнями GC, поскольку они доступны в течение всего времени выполнения программы, начиная с момента их загрузки класслоадером и до окончания работы приложения.
4️⃣JNI (Java Native Interface) ссылки
Объекты, на которые ссылаются из нативного кода через JNI, также являются корнями, так как они могут быть использованы внешним нативным кодом и не должны удаляться, пока такие ссылки существуют.
GC Roots играют ключевую роль в процессе сборки мусора, так как они определяют отправную точку для поиска объектов, которые должны остаться в памяти. Сборщик мусора использует эти корни для обхода всех достижимых объектов. Любой объект, который не может быть достигнут при обходе от корней, считается недостижимым и, следовательно, кандидатом на удаление, так как он больше не используется приложением.
Эффективность работы сборщика мусора и управление памятью в приложении зависят от того, как быстро и эффективно могут быть идентифицированы недостижимые объекты. Утечки памяти могут возникнуть, если объекты, которые должны были быть удалены, по-прежнему достижимы из-за ненужных ссылок, сохраняемых в GC Roots, делая их недоступными для сборки мусора.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍2❤1
Какие компоненты используются помимо activity ?
Спросят с вероятностью 13%
Помимо Activity используется ряд других ключевых компонентов, каждый из которых играет свою уникальную роль в создании функционального и эффективного мобильного приложения. Вот основные компоненты:
1️⃣Service (Сервис)
Используются для выполнения долговременных или фоновых операций без предоставления пользовательского интерфейса. Они могут выполняться даже тогда, когда пользователь не взаимодействует с приложением. Сервисы бывают нескольких типов:
✅Foreground Service: Запускается на переднем плане и показывает уведомление в шторке уведомлений, что делает его менее подверженным к системным ограничениям на фоновую работу.
✅Background Service: Работает в фоне и может быть ограничен системой при длительной работе в фоне.
✅Bound Service: Связывается с компонентом приложения через привязку, обеспечивая взаимодействие клиент-сервер внутри приложения.
2️⃣Broadcast Receiver (Приёмник широковещательных сообщений)
Позволяет приложениям получать и реагировать на широковещательные сообщения от других приложений или от самой системы. Например, приложения могут реагировать на события, такие как загрузка устройства, изменение состояния сети или низкий заряд батареи.
3️⃣Content Provider (Поставщик контента)
Предоставляет способ для приложений делиться данными с другими приложениями. Это абстракция данных, которая предоставляет стандартизированный интерфейс для доступа к набору данных приложения. Разработчики могут использовать Content Provider для чтения и записи данных, которые принадлежат другому приложению, при условии, что у них есть соответствующие разрешения.
4️⃣Fragment (Фрагмент)
Представляют собой модульные секции пользовательского интерфейса, которые можно вставить в
5️⃣View
Это базовый строительный блок для пользовательских интерфейсов в Android, элемент, который отрисовывается на экране и может взаимодействовать с пользователем. Может быть простым элементом, таким как текстовое поле или кнопка, или сложной композицией других View, организованных с помощью классов, наследующих
6️⃣ViewModel
Это компонент, который предназначен для управления данными, связанными с пользовательским интерфейсом, обеспечивая их сохранность при изменениях конфигурации
Эти компоненты вместе образуют основу для создания многофункциональных, масштабируемых и эффективных Android-приложений, каждый из которых выполняет свою специфическую роль в экосистеме приложения.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Помимо Activity используется ряд других ключевых компонентов, каждый из которых играет свою уникальную роль в создании функционального и эффективного мобильного приложения. Вот основные компоненты:
1️⃣Service (Сервис)
Используются для выполнения долговременных или фоновых операций без предоставления пользовательского интерфейса. Они могут выполняться даже тогда, когда пользователь не взаимодействует с приложением. Сервисы бывают нескольких типов:
✅Foreground Service: Запускается на переднем плане и показывает уведомление в шторке уведомлений, что делает его менее подверженным к системным ограничениям на фоновую работу.
✅Background Service: Работает в фоне и может быть ограничен системой при длительной работе в фоне.
✅Bound Service: Связывается с компонентом приложения через привязку, обеспечивая взаимодействие клиент-сервер внутри приложения.
2️⃣Broadcast Receiver (Приёмник широковещательных сообщений)
Позволяет приложениям получать и реагировать на широковещательные сообщения от других приложений или от самой системы. Например, приложения могут реагировать на события, такие как загрузка устройства, изменение состояния сети или низкий заряд батареи.
3️⃣Content Provider (Поставщик контента)
Предоставляет способ для приложений делиться данными с другими приложениями. Это абстракция данных, которая предоставляет стандартизированный интерфейс для доступа к набору данных приложения. Разработчики могут использовать Content Provider для чтения и записи данных, которые принадлежат другому приложению, при условии, что у них есть соответствующие разрешения.
4️⃣Fragment (Фрагмент)
Представляют собой модульные секции пользовательского интерфейса, которые можно вставить в
Activity. Имеют собственный жизненный цикл, могут быть повторно использованы в разных Activity и предназначены для создания адаптивных и гибких пользовательских интерфейсов, особенно на устройствах с большими экранами или изменяемой конфигурацией.5️⃣View
Это базовый строительный блок для пользовательских интерфейсов в Android, элемент, который отрисовывается на экране и может взаимодействовать с пользователем. Может быть простым элементом, таким как текстовое поле или кнопка, или сложной композицией других View, организованных с помощью классов, наследующих
ViewGroup.6️⃣ViewModel
Это компонент, который предназначен для управления данными, связанными с пользовательским интерфейсом, обеспечивая их сохранность при изменениях конфигурации
Activity, таких как поворот экрана. Работает в соответствии с принципами архитектуры MVVM для обеспечения разделения данных и логики представления.Эти компоненты вместе образуют основу для создания многофункциональных, масштабируемых и эффективных Android-приложений, каждый из которых выполняет свою специфическую роль в экосистеме приложения.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍3
Как работает hashmap ?
Спросят с вероятностью 33%
HashMap — это структура данных, которая позволяет хранить пары ключ-значение. Она использует хэш-функцию для определения места в массиве, где будет храниться каждая пара. Это обеспечивает быстрый доступ к элементам по ключу, поскольку вычисление хэша и поиск в массиве происходят очень быстро.
Как это работает:
1️⃣Хэширование ключа:
Когда вы добавляете пару ключ-значение в него, ключ сначала обрабатывается хэш-функцией, которая вычисляет хэш-код. Хэш-код — это целое число, и оно используется для определения индекса во внутреннем массиве, где должна храниться пара.
2️⃣Управление коллизиями:
Иногда два разных ключа могут дать один и тот же хэш-код, или разные хэш-коды могут свести к одному и тому же индексу массива из-за ограниченного размера массива. Это называется коллизией. HashMap управляет коллизиями, используя список (или другую структуру данных, например, красно-черное дерево) для хранения всех пар, которые попадают в одну и ту же ячейку массива.
3️⃣Добавление, поиск и удаление элементов:
✅Добавление (put): Ключ обрабатывается для создания хэш-кода, определяется индекс для хранения значения в массиве. Если в этом индексе уже есть элементы, новая пара добавляется в список.
✅Поиск (get): Ключ обрабатывается для создания хэш-кода, определяется индекс, и если в этом месте есть список, то происходит поиск нужной пары по ключу в списке.
✅Удаление (remove): Аналогично поиску, но после нахождения нужной пары, она удаляется из списка.
4️⃣Масштабирование:
Когда в него добавляется много элементов, и размер массива становится недостаточным для эффективного распределения элементов (то есть коэффициент заполнения становится слишком высоким), происходит процесс, называемый рехешированием, где создается новый, больший массив, и все текущие элементы перераспределяются по новому массиву согласно их хэш-кодам.
HashMap - это структура данных, использующая массив для хранения элементов и хэш-функцию для определения места элемента в массиве по ключу. Она позволяет быстро добавлять, искать и удалять элементы. В основе его работы лежит принцип "ключ-значение", что позволяет эффективно управлять данными.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 33%
HashMap — это структура данных, которая позволяет хранить пары ключ-значение. Она использует хэш-функцию для определения места в массиве, где будет храниться каждая пара. Это обеспечивает быстрый доступ к элементам по ключу, поскольку вычисление хэша и поиск в массиве происходят очень быстро.
Как это работает:
1️⃣Хэширование ключа:
Когда вы добавляете пару ключ-значение в него, ключ сначала обрабатывается хэш-функцией, которая вычисляет хэш-код. Хэш-код — это целое число, и оно используется для определения индекса во внутреннем массиве, где должна храниться пара.
2️⃣Управление коллизиями:
Иногда два разных ключа могут дать один и тот же хэш-код, или разные хэш-коды могут свести к одному и тому же индексу массива из-за ограниченного размера массива. Это называется коллизией. HashMap управляет коллизиями, используя список (или другую структуру данных, например, красно-черное дерево) для хранения всех пар, которые попадают в одну и ту же ячейку массива.
3️⃣Добавление, поиск и удаление элементов:
✅Добавление (put): Ключ обрабатывается для создания хэш-кода, определяется индекс для хранения значения в массиве. Если в этом индексе уже есть элементы, новая пара добавляется в список.
✅Поиск (get): Ключ обрабатывается для создания хэш-кода, определяется индекс, и если в этом месте есть список, то происходит поиск нужной пары по ключу в списке.
✅Удаление (remove): Аналогично поиску, но после нахождения нужной пары, она удаляется из списка.
4️⃣Масштабирование:
Когда в него добавляется много элементов, и размер массива становится недостаточным для эффективного распределения элементов (то есть коэффициент заполнения становится слишком высоким), происходит процесс, называемый рехешированием, где создается новый, больший массив, и все текущие элементы перераспределяются по новому массиву согласно их хэш-кодам.
import java.util.HashMap;
public class Example {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("ключ", 10);
Integer aValue = map.get("ключ");
System.out.println("Значение: " + aValue); // Выведет: Значение: 10
}
}
HashMap - это структура данных, использующая массив для хранения элементов и хэш-функцию для определения места элемента в массиве по ключу. Она позволяет быстро добавлять, искать и удалять элементы. В основе его работы лежит принцип "ключ-значение", что позволяет эффективно управлять данными.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍2
Зачем нужна view модель, и что в ней обычно происходит ?
Спросят с вероятностью 13%
Зачем она нужна
ViewModel — это компонент архитектуры приложений, предназначенный для хранения и управления данными, связанными с пользовательским интерфейсом, в соответствии с принципами архитектурного паттерна Model-View-ViewModel (MVVM). Предназначена для того, чтобы облегчить управление данными при конфигурационных изменениях, таких как повороты экрана, и предоставить данные пользовательскому интерфейсу в более удобной и оптимизированной форме.
Основные функции:
1️⃣Разделение ответственности: Действует как посредник между моделью данных и пользовательским интерфейсом (View), что помогает разделить бизнес-логику и логику управления пользовательским интерфейсом. Это обеспечивает более чистую архитектуру и упрощает тестирование компонентов.
2️⃣Управление жизненным циклом: Спроектирована так, чтобы быть осведомлённой о жизненном цикле
3️⃣Улучшенное управление ресурсами: Помогает управлять ресурсами более эффективно, загружая данные асинхронно и поддерживая их готовность для быстрого отображения в пользовательском интерфейсе. Это особенно важно в мобильных приложениях, где ресурсы (такие как память и процессорное время) ограничены.
Что обычно в нем происходит:
1️⃣Загрузка данных: Часто содержит логику для загрузки данных из репозиториев или сетевых источников. Эти данные могут быть кэшированы и подготовлены к быстрому доступу.
2️⃣Преобразование данных: Может преобразовывать данные из модели в формат, более подходящий для отображения в пользовательском интерфейсе. Например, форматирование строк, подготовка списков элементов для адаптеров и т.д.
3️⃣Управление подписками: Если в приложении используются потоки данных, например, через LiveData или RxJava, ViewModel управляет подписками и обеспечивает, чтобы пользовательский интерфейс подписывался на актуальные источники данных при их изменении.
4️⃣Обработка пользовательских действий: Может обрабатывать действия, инициированные в пользовательском интерфейсе, такие как клики по кнопкам, и инициировать соответствующие действия в бизнес-логике.
Пример:
ViewModel является важной частью современной Android-архитектуры, помогая создавать более надёжные, управляемые и тестируемые приложения. Она играет ключевую роль в управлении данными, их жизненным циклом и предоставлении их пользовательскому интерфейсу в оптимизированной форме.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Зачем она нужна
ViewModel — это компонент архитектуры приложений, предназначенный для хранения и управления данными, связанными с пользовательским интерфейсом, в соответствии с принципами архитектурного паттерна Model-View-ViewModel (MVVM). Предназначена для того, чтобы облегчить управление данными при конфигурационных изменениях, таких как повороты экрана, и предоставить данные пользовательскому интерфейсу в более удобной и оптимизированной форме.
Основные функции:
1️⃣Разделение ответственности: Действует как посредник между моделью данных и пользовательским интерфейсом (View), что помогает разделить бизнес-логику и логику управления пользовательским интерфейсом. Это обеспечивает более чистую архитектуру и упрощает тестирование компонентов.
2️⃣Управление жизненным циклом: Спроектирована так, чтобы быть осведомлённой о жизненном цикле
Activity или Fragment, что позволяет ей сохранять состояние данных при изменениях конфигурации. ViewModel не уничтожается при повороте экрана или других изменениях конфигурации, что позволяет избежать ненужной перезагрузки данных.3️⃣Улучшенное управление ресурсами: Помогает управлять ресурсами более эффективно, загружая данные асинхронно и поддерживая их готовность для быстрого отображения в пользовательском интерфейсе. Это особенно важно в мобильных приложениях, где ресурсы (такие как память и процессорное время) ограничены.
Что обычно в нем происходит:
1️⃣Загрузка данных: Часто содержит логику для загрузки данных из репозиториев или сетевых источников. Эти данные могут быть кэшированы и подготовлены к быстрому доступу.
2️⃣Преобразование данных: Может преобразовывать данные из модели в формат, более подходящий для отображения в пользовательском интерфейсе. Например, форматирование строк, подготовка списков элементов для адаптеров и т.д.
3️⃣Управление подписками: Если в приложении используются потоки данных, например, через LiveData или RxJava, ViewModel управляет подписками и обеспечивает, чтобы пользовательский интерфейс подписывался на актуальные источники данных при их изменении.
4️⃣Обработка пользовательских действий: Может обрабатывать действия, инициированные в пользовательском интерфейсе, такие как клики по кнопкам, и инициировать соответствующие действия в бизнес-логике.
Пример:
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users = new MutableLiveData<>();
public LiveData<List<User>> getUsers() {
if (users.getValue() == null) {
loadUsers();
}
return users;
}
private void loadUsers() {
// Загрузка пользователей из репозитория или сети
userRepository.getUsers(new DataLoadCallback() {
@Override
public void onDataLoaded(List<User> usersData) {
users.setValue(usersData);
}
});
}
}ViewModel является важной частью современной Android-архитектуры, помогая создавать более надёжные, управляемые и тестируемые приложения. Она играет ключевую роль в управлении данными, их жизненным циклом и предоставлении их пользовательскому интерфейсу в оптимизированной форме.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Anonymous Quiz
91%
for (i in 1..10) { println(i) }
6%
for (int i = 0; i < 10; i++) { println(i) }
2%
oreach i in 1..10 { println(i) }
2%
for (i from 1 to 10) { println(i) }
Что такое interface и чем он отличается от абстрактного класса ?
Спросят с вероятностью 20%
Interface (интерфейс) - это структура, которая определяет набор абстрактных методов, которые должен реализовать класс, объявляющий, что он реализует этот интерфейс. Интерфейсы не могут содержать реализацию методов (за исключением default и static методов, доступных начиная с Java 8), и все методы в интерфейсе по умолчанию являются public и abstract. Интерфейсы также могут содержать константы.
Абстрактный класс — это класс, который не может быть инстанцирован сам по себе и может содержать как абстрактные методы (без реализации), так и методы с реализацией. Абстрактные классы могут также содержать состояние (поля данных), конструкторы и деструкторы.
Основные отличия:
1️⃣Множественное наследование:
✅Интерфейс: Класс может реализовать множество интерфейсов, что позволяет использовать множественное наследование.
✅Абстрактный класс: Класс может наследовать только один абстрактный класс, так как она не поддерживает множественное наследование классов.
2️⃣Реализация методов:
✅Интерфейс: Не может содержать реализацию методов (за исключением default и static методов в Java 8 и новее).
✅Абстрактный класс: Может содержать полную реализацию методов, а также абстрактные методы.
3️⃣Поля и состояние:
✅Интерфейс: Может содержать только константы (public static final поля).
✅Абстрактный класс: Может содержать поля, которые могут иметь различные уровни доступа и не обязательно быть константами.
4️⃣Конструкторы и деструкторы:
✅Интерфейс: Не может содержать конструкторы.
✅Абстрактный класс: Может содержать конструкторы, что позволяет выполнять инициализацию класса перед использованием.
Пример:
Интерфейс определяет "что" класс должен делать, тогда как абстрактный класс может определять "что" и "как" (частично). Интерфейс идеален для определения общего функционала, который может быть различным для разных классов, в то время как абстрактные классы лучше подходят для определения общего базового функционала с частичной или полной реализацией.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 20%
Interface (интерфейс) - это структура, которая определяет набор абстрактных методов, которые должен реализовать класс, объявляющий, что он реализует этот интерфейс. Интерфейсы не могут содержать реализацию методов (за исключением default и static методов, доступных начиная с Java 8), и все методы в интерфейсе по умолчанию являются public и abstract. Интерфейсы также могут содержать константы.
Абстрактный класс — это класс, который не может быть инстанцирован сам по себе и может содержать как абстрактные методы (без реализации), так и методы с реализацией. Абстрактные классы могут также содержать состояние (поля данных), конструкторы и деструкторы.
Основные отличия:
1️⃣Множественное наследование:
✅Интерфейс: Класс может реализовать множество интерфейсов, что позволяет использовать множественное наследование.
✅Абстрактный класс: Класс может наследовать только один абстрактный класс, так как она не поддерживает множественное наследование классов.
2️⃣Реализация методов:
✅Интерфейс: Не может содержать реализацию методов (за исключением default и static методов в Java 8 и новее).
✅Абстрактный класс: Может содержать полную реализацию методов, а также абстрактные методы.
3️⃣Поля и состояние:
✅Интерфейс: Может содержать только константы (public static final поля).
✅Абстрактный класс: Может содержать поля, которые могут иметь различные уровни доступа и не обязательно быть константами.
4️⃣Конструкторы и деструкторы:
✅Интерфейс: Не может содержать конструкторы.
✅Абстрактный класс: Может содержать конструкторы, что позволяет выполнять инициализацию класса перед использованием.
Пример:
interface Animal {
void eat();
}
abstract class Mammal {
abstract void breathe();
void sleep() {
System.out.println("Sleeping");
}
}
class Dog extends Mammal implements Animal {
@Override
public void eat() {
System.out.println("Dog is eating");
}
@Override
void breathe() {
System.out.println("Dog is breathing");
}
}Интерфейс определяет "что" класс должен делать, тогда как абстрактный класс может определять "что" и "как" (частично). Интерфейс идеален для определения общего функционала, который может быть различным для разных классов, в то время как абстрактные классы лучше подходят для определения общего базового функционала с частичной или полной реализацией.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍5
Что известно о композиции классов ?
Спросят с вероятностью 13%
Композиция классов — это один из фундаментальных принципов объектно-ориентированного программирования, который используется для моделирования отношений между объектами. В контексте композиции один класс включает в себя один или несколько объектов других классов в качестве своих полей, тем самым достигая более сложной функциональности через комбинирование поведений и свойств этих объектов.
Основные аспекты:
1️⃣Сильная связь: В композиции объекты классов, которые используются как поля, тесно связаны с классом-контейнером. Это означает, что их жизненный цикл зависит от жизненного цикла контейнера. Если контейнер уничтожается, то уничтожаются и включенные в него объекты.
2️⃣Определение отношений "часть-целое": Композиция часто используется для моделирования отношений "часть-целое". Например, класс "Автомобиль" может включать в себя объекты классов "Колесо", "Двигатель" и "Салон", каждый из которых является неотъемлемой частью автомобиля.
3️⃣Повторное использование кода: Композиция позволяет повторно использовать код, поскольку объекты классов, созданные для определённых функций, могут быть легко интегрированы в другие классы.
4️⃣Избежание проблем, связанных с множественным наследованием: В некоторых языках программирования, таких как Java, не поддерживается множественное наследование классов из-за его сложности и возможных проблем с разрешением, связанных с наследованием от нескольких классов. Композиция предоставляет альтернативный и более гибкий способ объединения функциональности из нескольких источников.
5️⃣Гибкость в дизайне: Использование композиции предоставляет большую гибкость в проектировании программного обеспечения, так как изменения в одном классе меньше влияют на классы, которые используют его объекты.
Пример:
В этом примере класс
Композиция классов является мощным инструментом проектирования в ООП, который помогает строить гибкие, модульные и легко расширяемые приложения. Использование композиции вместо наследования может сделать код более управляемым, уменьшить связанность между классами и улучшить возможности повторного использования кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Композиция классов — это один из фундаментальных принципов объектно-ориентированного программирования, который используется для моделирования отношений между объектами. В контексте композиции один класс включает в себя один или несколько объектов других классов в качестве своих полей, тем самым достигая более сложной функциональности через комбинирование поведений и свойств этих объектов.
Основные аспекты:
1️⃣Сильная связь: В композиции объекты классов, которые используются как поля, тесно связаны с классом-контейнером. Это означает, что их жизненный цикл зависит от жизненного цикла контейнера. Если контейнер уничтожается, то уничтожаются и включенные в него объекты.
2️⃣Определение отношений "часть-целое": Композиция часто используется для моделирования отношений "часть-целое". Например, класс "Автомобиль" может включать в себя объекты классов "Колесо", "Двигатель" и "Салон", каждый из которых является неотъемлемой частью автомобиля.
3️⃣Повторное использование кода: Композиция позволяет повторно использовать код, поскольку объекты классов, созданные для определённых функций, могут быть легко интегрированы в другие классы.
4️⃣Избежание проблем, связанных с множественным наследованием: В некоторых языках программирования, таких как Java, не поддерживается множественное наследование классов из-за его сложности и возможных проблем с разрешением, связанных с наследованием от нескольких классов. Композиция предоставляет альтернативный и более гибкий способ объединения функциональности из нескольких источников.
5️⃣Гибкость в дизайне: Использование композиции предоставляет большую гибкость в проектировании программного обеспечения, так как изменения в одном классе меньше влияют на классы, которые используют его объекты.
Пример:
class Engine {
void start() {
System.out.println("Двигатель запущен.");
}
}
class Wheel {
void rotate() {
System.out.println("Колесо вращается.");
}
}
class Car {
private Engine engine = new Engine();
private Wheel[] wheels = { new Wheel(), new Wheel(), new Wheel(), new Wheel() };
void start() {
engine.start();
for (Wheel wheel : wheels) {
wheel.rotate();
}
System.out.println("Автомобиль поехал.");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car();
car.start();
}
}В этом примере класс
Car компонуется из объектов Engine и массива объектов Wheel. Метод start() в классе Car использует методы объектов, входящих в его состав, для моделирования запуска автомобиля.Композиция классов является мощным инструментом проектирования в ООП, который помогает строить гибкие, модульные и легко расширяемые приложения. Использование композиции вместо наследования может сделать код более управляемым, уменьшить связанность между классами и улучшить возможности повторного использования кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍3
Anonymous Quiz
90%
when (x) { 1 -> print("One") 2 -> print("Two") else -> print("Other") }
3%
switch (x) { 1 -> print("One") 2 -> print("Two") default -> print("Other") }
3%
when (x) { case 1: print("One") case 2: print("Two") else: print("Other") }
3%
when (x) { 1: print("One") 2: print("Two") else: print("Other") }
Что знаешь о диспатчерах ?
Спросят с вероятностью 13%
Термин "диспатчер" обычно связан с механизмами управления потоками и задачами, такими как
CoroutineDispatcher
Определяет, на каком потоке будет выполняться корутина. В Kotlin Coroutines диспатчеры управляют тем, как и где корутины выполняют свои задачи в зависимости от контекста, в котором они запущены.
Основные типы диспатчеров:
1️⃣Dispatchers.Main - используется для выполнения корутин на главном потоке пользовательского интерфейса. Это важно для задач, которые взаимодействуют с пользовательским интерфейсом, так как изменения UI должны происходить исключительно на главном потоке.
2️⃣Dispatchers.IO - оптимизирован для работы с вводом-выводом, например, чтения и записи файлов, работы с сетью и т.д. Этот диспатчер предназначен для операций, которые могут блокировать текущий поток, выполняя длительные операции ввода-вывода.
3️⃣Dispatchers.Default - оптимизирован для выполнения вычислительных задач, которые требуют значительных ресурсов CPU. Хорошо подходит для больших сортировок, парсинга данных и других вычислительно сложных операций.
4️⃣Dispatchers.Unconfined - корутина, запущенная с этим диспатчером, начинает выполнение в текущем потоке, но только до первого точки приостановки. После возобновления она может продолжить выполнение в другом потоке. Этот диспатчер редко используется, так как его поведение может быть непредсказуемым и привести к ошибкам в многопоточности.
Пример:
Диспатчеры определяют, на каких потоках выполняются корутины, помогая эффективно распределять задачи в зависимости от их характера и требований к ресурсам. Использование правильного диспатчера может значительно повысить производительность и отзывчивость приложений.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Термин "диспатчер" обычно связан с механизмами управления потоками и задачами, такими как
CoroutineDispatcher. Давайте рассмотрим эту тему более подробно, а также упомянем диспатчеры в других контекстах, если это уместно.CoroutineDispatcher
Определяет, на каком потоке будет выполняться корутина. В Kotlin Coroutines диспатчеры управляют тем, как и где корутины выполняют свои задачи в зависимости от контекста, в котором они запущены.
Основные типы диспатчеров:
1️⃣Dispatchers.Main - используется для выполнения корутин на главном потоке пользовательского интерфейса. Это важно для задач, которые взаимодействуют с пользовательским интерфейсом, так как изменения UI должны происходить исключительно на главном потоке.
2️⃣Dispatchers.IO - оптимизирован для работы с вводом-выводом, например, чтения и записи файлов, работы с сетью и т.д. Этот диспатчер предназначен для операций, которые могут блокировать текущий поток, выполняя длительные операции ввода-вывода.
3️⃣Dispatchers.Default - оптимизирован для выполнения вычислительных задач, которые требуют значительных ресурсов CPU. Хорошо подходит для больших сортировок, парсинга данных и других вычислительно сложных операций.
4️⃣Dispatchers.Unconfined - корутина, запущенная с этим диспатчером, начинает выполнение в текущем потоке, но только до первого точки приостановки. После возобновления она может продолжить выполнение в другом потоке. Этот диспатчер редко используется, так как его поведение может быть непредсказуемым и привести к ошибкам в многопоточности.
Пример:
import kotlinx.coroutines.*
fun main() = runBlocking<Unit> {
launch(Dispatchers.Main) {
// Обновление пользовательского интерфейса
println("Main thread: ${Thread.currentThread().name}")
}
launch(Dispatchers.IO) {
// Задача ввода-вывода
println("IO thread: ${Thread.currentThread().name}")
}
launch(Dispatchers.Default) {
// Тяжелая вычислительная задача
println("Default thread: ${Thread.currentThread().name}")
}
}
Диспатчеры определяют, на каких потоках выполняются корутины, помогая эффективно распределять задачи в зависимости от их характера и требований к ресурсам. Использование правильного диспатчера может значительно повысить производительность и отзывчивость приложений.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍4❤1
Что такое фрагменты и почему их удобнее использовать вместо множества activity ?
Спросят с вероятностью 13%
Фрагменты — это модули в пользовательском интерфейсе, которые могут быть вложены в активности (Activity). Представляют собой часть пользовательского интерфейса или поведения, которые можно вставить в активность. Они обладают собственным жизненным циклом, получают собственные входные события и могут быть добавлены или удалены при работе активности.
Почему использование фрагментов удобнее, чем использование множества активностей:
1️⃣Модульность
Способствуют более модульному дизайну приложения. Они позволяют разделить различные функции приложения на независимые компоненты, которые можно повторно использовать в разных активностях. Например, фрагмент для выбора даты можно использовать как в форме бронирования, так и в профиле пользователя.
2️⃣Адаптивность
Идеально подходят для создания адаптивных пользовательских интерфейсов, поддерживающих множество устройств, особенно планшетов и телефонов. На планшете можно одновременно отображать несколько фрагментов (например, список и детали), в то время как на телефоне фрагменты будут отображаться поочередно.
3️⃣Управление жизненным циклом
Имеют собственный жизненный цикл, который тесно связан с жизненным циклом их хост-активности. Это позволяет фрагментам независимо управлять своим состоянием и поведением, что упрощает управление сложными интерфейсами и динамическими элементами в приложении.
4️⃣Повторное использование кода
Код, написанный для фрагментов, легко переиспользовать в различных частях приложения или даже в разных приложениях. Это повышает эффективность разработки и поддержки приложений.
5️⃣Улучшенная производительность
Управление одной активностью с множеством фрагментов может быть более эффективным, чем переключение между множеством активностей. Переключение фрагментов внутри одной активности обычно требует меньше ресурсов, чем запуск новой активности.
6️⃣Лучшее управление переходами и анимациями
Предоставляет мощные инструменты для управления переходами между фрагментами, включая поддержку сложных анимаций. Это создает плавный и привлекательный пользовательский опыт.
Пример:
Файл FragmentExample.java:
Файл fragment_example.xml:
Использование фрагментов позволяет создавать более гибкие, модульные и эффективные приложения. Фрагменты обеспечивают лучшую адаптивность к различным устройствам и ориентациям экрана, упрощают повторное использование компонентов интерфейса и улучшают управление состоянием приложения.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Фрагменты — это модули в пользовательском интерфейсе, которые могут быть вложены в активности (Activity). Представляют собой часть пользовательского интерфейса или поведения, которые можно вставить в активность. Они обладают собственным жизненным циклом, получают собственные входные события и могут быть добавлены или удалены при работе активности.
Почему использование фрагментов удобнее, чем использование множества активностей:
1️⃣Модульность
Способствуют более модульному дизайну приложения. Они позволяют разделить различные функции приложения на независимые компоненты, которые можно повторно использовать в разных активностях. Например, фрагмент для выбора даты можно использовать как в форме бронирования, так и в профиле пользователя.
2️⃣Адаптивность
Идеально подходят для создания адаптивных пользовательских интерфейсов, поддерживающих множество устройств, особенно планшетов и телефонов. На планшете можно одновременно отображать несколько фрагментов (например, список и детали), в то время как на телефоне фрагменты будут отображаться поочередно.
3️⃣Управление жизненным циклом
Имеют собственный жизненный цикл, который тесно связан с жизненным циклом их хост-активности. Это позволяет фрагментам независимо управлять своим состоянием и поведением, что упрощает управление сложными интерфейсами и динамическими элементами в приложении.
4️⃣Повторное использование кода
Код, написанный для фрагментов, легко переиспользовать в различных частях приложения или даже в разных приложениях. Это повышает эффективность разработки и поддержки приложений.
5️⃣Улучшенная производительность
Управление одной активностью с множеством фрагментов может быть более эффективным, чем переключение между множеством активностей. Переключение фрагментов внутри одной активности обычно требует меньше ресурсов, чем запуск новой активности.
6️⃣Лучшее управление переходами и анимациями
Предоставляет мощные инструменты для управления переходами между фрагментами, включая поддержку сложных анимаций. Это создает плавный и привлекательный пользовательский опыт.
Пример:
Файл FragmentExample.java:
public class FragmentExample extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_example, container, false);
}
}Файл fragment_example.xml:
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello Fragment!"
android:gravity="center" />
</LinearLayout>
Использование фрагментов позволяет создавать более гибкие, модульные и эффективные приложения. Фрагменты обеспечивают лучшую адаптивность к различным устройствам и ориентациям экрана, упрощают повторное использование компонентов интерфейса и улучшают управление состоянием приложения.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍4
Anonymous Quiz
5%
single
12%
singleton
83%
object
1%
class
Что известно про модификатор доступа ?
Спросят с вероятностью 13%
Модификаторы доступа используются для управления доступом к классам, методам, интерфейсам и переменным в вашем коде. Это важные элементы языка, которые помогают вам управлять инкапсуляцией в программе, ограничивая видимость данных и методов.
Модификаторы доступа в Java
Существуют четыре основных модификатора доступа:
1️⃣public - члены класса доступны из любого другого класса.
2️⃣protected - члены класса доступны только внутри того же пакета или подклассам.
3️⃣default (package-private) - члены класса доступны только внутри того же пакета. Этот уровень доступа устанавливается по умолчанию, если не указан другой модификатор.
4️⃣private - члены класса доступны только внутри самого класса.
Модификаторы доступа в Kotlin
Используются следующие модификаторы доступа:
1️⃣public - члены класса доступны из любой части программы; это уровень доступа по умолчанию.
2️⃣internal - члены класса доступны только внутри того же модуля компиляции.
3️⃣protected - члены класса доступны только внутри того же класса или его подклассов.
4️⃣private - члены класса доступны только внутри класса, где они объявлены.
Особенности:
Вводит модификатор internal, который представляет собой компромисс между
Также нет точного аналога default (package-private) доступа Java, так как ближайший по смыслу модификатор
Примеры:
Java:
Kotlin:
Модификаторы доступа предназначены для контроля видимости и доступности членов класса, что является ключевым аспектом инкапсуляции и безопасности программы. Они помогают ограничивать доступ к данным и методам, тем самым управляя тем, как и где может быть использована функциональность вашего кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 13%
Модификаторы доступа используются для управления доступом к классам, методам, интерфейсам и переменным в вашем коде. Это важные элементы языка, которые помогают вам управлять инкапсуляцией в программе, ограничивая видимость данных и методов.
Модификаторы доступа в Java
Существуют четыре основных модификатора доступа:
1️⃣public - члены класса доступны из любого другого класса.
2️⃣protected - члены класса доступны только внутри того же пакета или подклассам.
3️⃣default (package-private) - члены класса доступны только внутри того же пакета. Этот уровень доступа устанавливается по умолчанию, если не указан другой модификатор.
4️⃣private - члены класса доступны только внутри самого класса.
Модификаторы доступа в Kotlin
Используются следующие модификаторы доступа:
1️⃣public - члены класса доступны из любой части программы; это уровень доступа по умолчанию.
2️⃣internal - члены класса доступны только внутри того же модуля компиляции.
3️⃣protected - члены класса доступны только внутри того же класса или его подклассов.
4️⃣private - члены класса доступны только внутри класса, где они объявлены.
Особенности:
Вводит модификатор internal, который представляет собой компромисс между
public и private в Java. Суть его в том, что доступ ограничивается пределами одного модуля. Модуль в Kotlin — это набор файлов, скомпилированных вместе.Также нет точного аналога default (package-private) доступа Java, так как ближайший по смыслу модификатор
internal шире, чем package-private.Примеры:
Java:
public class MyClass {
public int publicVar = 1;
protected int protectedVar = 2;
int packagePrivateVar = 3; // default, no modifier
private int privateVar = 4;
}Kotlin:
class MyClass {
var publicVar = 1 // по умолчанию public
protected var protectedVar = 2
internal var internalVar = 3
private var privateVar = 4
}Модификаторы доступа предназначены для контроля видимости и доступности членов класса, что является ключевым аспектом инкапсуляции и безопасности программы. Они помогают ограничивать доступ к данным и методам, тем самым управляя тем, как и где может быть использована функциональность вашего кода.
👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍3