Kotlin | Вопросы собесов
2.56K subscribers
27 photos
957 links
Download Telegram
Зачем нужна view модель, и что в ней обычно происходит ?
Спросят с вероятностью 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 разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
Что такое interface и чем он отличается от абстрактного класса ?
Спросят с вероятностью 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️⃣Гибкость в дизайне: Использование композиции предоставляет большую гибкость в проектировании программного обеспечения, так как изменения в одном классе меньше влияют на классы, которые используют его объекты.

Пример:
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
Что знаешь о диспатчерах ?
Спросят с вероятностью 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 разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍41
Что такое фрагменты и почему их удобнее использовать вместо множества activity ?
Спросят с вероятностью 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
🤔 Какой ключевое слово используется для создания объектов-одиночек (singleton) в Kotlin?
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, который представляет собой компромисс между 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
Что представляет собой view и что отвечает за ее визуальную часть ?
Спросят с вероятностью 13%

View представляет собой основной строительный блок для пользовательских интерфейсов. В самом базовом виде, это объект, который нарисован на экране и может взаимодействовать с пользователем. Это может быть любой графический элемент, например кнопка, текстовое поле, список и так далее.

Структура и функциональность:

1️⃣Визуальное представление и взаимодействие:
View является базовым классом для виджетов, которые пользователи видят и с которыми взаимодействуют на экране.
Примеры виджетов включают Button, TextView, EditText, ImageView, CheckBox, RadioButton и многие другие.

2️⃣Иерархия Views:
Могут быть организованы в деревья. Например, ViewGroup является расширенным классом View, который может содержать другие Views (такие как LinearLayout, RelativeLayout, и ConstraintLayout), образуя тем самым сложные пользовательские интерфейсы.
ViewGroup действует как контейнер для других Views или других ViewGroup, обеспечивая компоновку (layout) на экране.

3️⃣Отрисовка (Rendering):
Отвечает за отрисовку себя на экране устройства. Каждая View имеет метод onDraw(Canvas canvas), который вызывается системой Android при необходимости нарисовать View. В этом методе определяется, как именно View будет выглядеть.

4️⃣Обработка событий:
Также обрабатывает различные события ввода, такие как касания, клики, ввод текста и т.д. Методы, такие как onTouchEvent(MotionEvent event), позволяют View реагировать на действия пользователя.

Что отвечает за визуальную часть?

1️⃣XML Layouts:
Большинство Views определяется в XML файлах разметки (layouts), где вы можете настроить их внешний вид и поведение, задав различные атрибуты, такие как размеры, маргины, паддинги, фоны, шрифты и другие свойства.
Разметки позволяют легко создавать и изменять пользовательский интерфейс, не затрагивая логику приложения.

2️⃣Стили и темы:
Можно определить стили и темы, которые могут быть применены к Views, чтобы обеспечить единообразный внешний вид по всему приложению. Стили можно определить в ресурсах и применять к Views в XML или программно.

3️⃣Методы программирования:
Могут динамически изменять внешний вид View в коде, используя методы, такие как setBackground(), setTextColor(), setVisibility() и другие. Это может быть полезно для динамического изменения интерфейса в ответ на действия пользователя или изменения состояния приложения.

View не просто компонент пользовательского интерфейса, это мощный инструмент, который предоставляет обширные возможности для создания интерактивных и адаптивных интерфейсов, поддерживающих разнообразные устройства и конфигурации экрана.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍3
🤔 Каков правильный способ создания вложенного класса в Kotlin?
Anonymous Quiz
52%
class Outer { inner class Inner }
19%
class Outer { class Inner }
10%
class Outer { nested class Inner }
19%
class Outer { class Inner() }
😁4👍1
Что такое абстрактный класс и для чего он используется ?
Спросят с вероятностью 13%

Абстрактный класс представляет собой класс, который не может быть инстанцирован напрямую. Это означает, что вы не можете создать объект такого класса непосредственно. Предназначены для использования в качестве базовых классов, от которых будут наследовать другие классы.

Зачем он нужен:

1️⃣Определение общего шаблона: Позволяет определить общий шаблон для группы подклассов. Он может предоставить реализацию по умолчанию для некоторых методов и оставить другие методы абстрактными (без реализации), чтобы их реализовали подклассы.

2️⃣Инкапсуляция общих свойств и методов: Используются для инкапсуляции атрибутов и методов, которые должны быть общими для всех подклассов. Это сокращает дублирование кода и улучшает модульность.

3️⃣Принудительная реализация методов: Может требовать, чтобы все производные классы реализовывали определённые методы, что гарантирует, что независимо от реализации подкласса, он будет иметь определённый интерфейс.

Особенности:

Неинстанцируемость: Непосредственное создание экземпляров абстрактного класса невозможно.
Содержание абстрактных методов: В классе не имеют реализации. Их реализация обязательно должна быть предоставлена в подклассах.
Может содержать реализацию: Может также содержать полностью реализованные методы.

Пример:
abstract class Animal {
abstract void makeSound();

void breathe() {
System.out.println("I am breathing.");
}
}

class Dog extends Animal {
void makeSound() {
System.out.println("Bark");
}
}

public class Test {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.makeSound(); // Выводит: Bark
myDog.breathe(); // Выводит: I am breathing.
}
}


В этом примере Animal - абстрактный класс, который определяет абстрактный метод makeSound() и реализует метод breathe(). Класс Dog наследует Animal и предоставляет реализацию метода makeSound().

Абстрактный класс используется для определения базового шаблона для других классов. Это позволяет программистам применять общие методы и структуру, требуя при этом реализации определенных функций в дочерних классах. Такой подход улучшает организацию кода, его повторное использование и поддерживаемость.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍2
🤔 Какой из вариантов правильно объявляет интерфейс с методом в Kotlin?
Anonymous Quiz
4%
interface MyInterface { void doSomething() }
1%
interface MyInterface { def doSomething() }
2%
interface MyInterface { function doSomething() }
93%
interface MyInterface { fun doSomething(): Unit }
🤔2👀2
📌 Какие есть методы жизненного цикла Activity и как они отрабатывают ?

💬 Спрашивают в 60% собеседований

Методы жизненного цикла Activity представляют собой набор коллбэков, которые вызываются системой при изменении состояния Activity. Эти методы предоставляют возможность управлять поведением приложения при создании, остановке, восстановлении или уничтожении. Понимание и правильное использование этих методов критически важно для создания надежных и эффективных приложений.

🤔 Основные методы жизненного цикла:

1️⃣ `onCreate(Bundle savedInstanceState)`

Этот метод вызывается при первом создании Activity. Здесь вы должны выполнить все начальную настройку — например, создать пользовательский интерфейс, инициализировать некоторые данные класса. Это место для всего, что должно произойти один раз за время жизни.
Пример: setContentView(R.layout.activity_main); устанавливает разметку пользовательского интерфейса для Activity.

2️⃣ `onStart()`

Вызывается, когда Activity становится видимым для пользователя. Это следует за onCreate() (если он запускается впервые) или onRestart() (если он возвращается к взаимодействию с пользователем после его остановки).

3️⃣ `onResume()`

Вызывается непосредственно перед тем, как Activity начинает взаимодействовать с пользователем. В этот момент он находится на переднем плане (на экране). Это последний метод, который вызывается перед тем, как он начнет получать ввод данных от пользователя.

4️⃣ `onPause()`

Вызывается, когда система собирается продолжить или возобновить другую Activity. Этот метод используется для остановки динамических элементов, которые могли быть запущены во время onResume() или для освобождения ресурсов, которые могут быть нужны другим.

5️⃣ `onStop()`

Вызывается, когда Activity больше не видимо пользователю, потому что другое Activity было возобновлено и покрыло его. Это может быть использовано для выполнения более "тяжеловесной" очистки ресурсов.

6️⃣ `onRestart()`

Вызывается после того, как Activity было остановлено, но снова начинает запускаться для взаимодействия с пользователем. onRestart() восстанавливает его состояние в том виде, в каком оно было перед тем, как было остановлено.

7️⃣ `onDestroy()`

Этот метод вызывается перед уничтожением Activity. Это последний вызов, который он получает. Здесь можно освободить все ресурсы, которые не были освобождены автоматически системой.

🤔 Как они отрабатывают

Жизненный цикл начинается с вызова onCreate() и проходит через серию стадий, включая onStart(), onResume(), onPause(), onStop(), и, в конечном итоге, onDestroy(). В какой-то момент, если Activity останавливается, но позже должно быть восстановлено, вызывается onRestart(), за которым следуют onStart() и onResume(). Важно понимать, что каждый метод предназначен для определенной стадии жизни Activity и предоставляет возможность для выполнения соответствующих действий, таких как инициализация, пауза, восстановление и очистка ресурсов.

Методы жизненного цикла Activity — это специальные функции, которые вызываются системой в определенные моменты жизни Activity, чтобы разработчики могли правильно управлять ресурсами и интерфейсом пользователя. Они обеспечивают плавное создание, видимость, взаимодействие, паузу и уничтожение Activity.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Какой из вариантов правильно определяет использование Elvis-оператора в Kotlin?
Anonymous Quiz
6%
val length = name?.length !! 0
4%
val length = name?.length ?? 0
88%
val length = name?.length ?: 0
2%
val length = name?.length !? 0
📌 Для чего нужен data class ?

💬 Спрашивают в 60% собеседований

Классы данных (data class) предназначены для хранения данных. Основная их задача — упростить создание классов, которые будут использоваться преимущественно для хранения данных, не добавляя при этом лишнего шаблонного кода. Чтобы определить класс данных, достаточно добавить ключевое слово data перед объявлением класса.

🤔 Особенности и преимущества:

1️⃣Автоматическая генерация функций:

equals()/hashCode(): Для сравнения объектов по содержимому, а не по ссылкам.
toString(): Для представления объекта в виде строки в удобочитаемом формате.
componentN(): Для деструктуризации объекта на его составные части.
copy(): Для создания копии объекта с возможностью изменять некоторые свойства.

🤔 Зачем это нужно?

Его использование позволяет существенно сократить количество шаблонного кода, который разработчикам приходится писать для классов, предназначенных для хранения данных. Это упрощает создание моделей данных и повышает читабельность кода, делая его более компактным и понятным.

Пример:
data class User(val name: String, val age: Int)


В этом примере определен класс данных User с двумя свойствами: name и age. Kotlin автоматически сгенерирует для этого класса методы equals(), hashCode(), toString(), компонентные функции для каждого свойства и метод copy().

Без использования data class, пришлось бы вручную реализовать все эти методы, что ведет к увеличению объема кода и его сложности.

Data class используются для упрощения создания классов, предназначенных для хранения данных. Они автоматически генерируют необходимые методы, что позволяет сделать код более чистым, удобным для чтения и поддержки. Это идеальное решение для моделей данных, где основная цель класса — это хранение данных.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯1👀1
🤔 Как правильно объявить переменную типа nullable String в Kotlin?
Anonymous Quiz
93%
val name: String? = null
3%
val name: String = null
4%
val name: ?String = null
1%
val name: nullable String = null
📌 Какие основные компоненты Аndroid-приложения ?

💬 Спрашивают в 53% собеседований

Основные компоненты Android-приложения включают Activity, Services, Broadcast Receivers и Content Providers. Эти компоненты обеспечивают основную функциональность приложения, позволяя ему взаимодействовать с пользователем, выполнять задачи в фоновом режиме, реагировать на системные или приложенческие события и управлять данными.

1️⃣ Activity представляет собой один экран с пользовательским интерфейсом. Каждая активность предназначена для выполнения одной конкретной задачи (например, выбора фотографии из галереи или отправки сообщения). Пользователь взаимодействует с приложением в основном через активности.

2️⃣ Services — это компоненты, которые выполняют длительные или фоновые операции без предоставления пользовательского интерфейса. Например, сервис может воспроизводить музыку в фоне, когда пользователь находится в другом приложении, или синхронизировать данные в фоновом режиме.

3️⃣ Broadcast Receivers предназначены для прослушивания и реагирования на широковещательные сообщения от других приложений или системы. Например, приложение может запускать определенные действия или уведомления в ответ на сообщения о низком заряде батареи или загрузке новой фотографии.

4️⃣ Content Providers позволяют приложениям хранить и делиться данными. Через них можно осуществлять доступ к данным внутри одного приложения из других приложений, а также управлять доступом к этим данным. Примером может служить доступ к контактам или медиафайлам на устройстве.

Каждый из этих компонентов играет свою роль в создании целостного и функционального Android-приложения. Они могут взаимодействовать друг с другом через явные или неявные намерения (Intents), предоставляя разнообразные способы выполнения задач и обмена данными.

Основные компоненты Android-приложения — это строительные блоки, которые позволяют создавать разнообразные пользовательские интерфейсы, выполнять задачи в фоне, реагировать на события и управлять данными. Эти компоненты включают Activity, Services, Broadcast Receivers и Content Providers.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
🤔 Какой из способов правильно использует оператор приведения типа в Kotlin?
Anonymous Quiz
4%
val number = x cast Int
91%
val number = x as Int
4%
val number = x as! Int
1%
val number = x convert Int
📌 В чем преимущество Kotlin для разработки под android ?

💬 Спрашивают в 47% собеседований

Kotlin, язык программирования, разработанный JetBrains, представляет собой статически типизированный язык, который полностью совместим с Java и специально оптимизирован для разработки под Android. Преимущества в контексте разработки Android-приложений многочисленны и значительны:

1️⃣ Более краткий и выразительный синтаксис: Kotlin позволяет писать код более кратко и чисто по сравнению с Java, сокращая количество шаблонного кода. Это делает код легче для чтения и поддержки.

2️⃣ Null безопасность: В Kotlin встроена поддержка обработки значений null, что помогает избежать NullPointerException - одной из наиболее распространенных ошибок в Java-приложениях.

3️⃣ Расширенные функции (Extension functions): Kotlin позволяет добавлять новые функции к существующим классам без их модификации. Это упрощает работу с API Android, делая код более читабельным и лаконичным.

4️⃣ Поддержка функционального программирования: Kotlin включает множество функций функционального программирования, таких как лямбда-выражения, высшие порядки функций, которые делают код более гибким и выразительным.

5️⃣ Полная совместимость с Java: Kotlin полностью совместим с Java, что позволяет легко использовать все существующие Java-библиотеки и фреймворки в Kotlin-проектах, а также постепенно переводить существующий Java-код на Kotlin.

6️⃣ Инструментальная поддержка: Kotlin полностью поддерживается в Android Studio, что обеспечивает удобные инструменты для разработки, такие как автодополнение, рефакторинг кода, проверка ошибок в реальном времени.

7️⃣ Корутины для асинхронного программирования: Kotlin предоставляет встроенную поддержку корутин, что упрощает работу с асинхронными операциями, такими как выполнение сетевых запросов или чтение из базы данных, делая код более понятным и менее подверженным ошибкам.

8️⃣ Улучшенная безопасность: Благодаря более строгой системе типов и обработке исключений, Kotlin помогает предотвратить распространенные ошибки во время компиляции, что повышает общую безопасность приложения.

9️⃣ Официальная поддержка Google: С 2017 года Kotlin является официальным языком для разработки Android-приложений, что гарантирует его постоянное обновление и поддержку со стороны Google.

Kotlin предлагает мощные возможности, такие как более краткий и чистый код, повышенную безопасность, улучшенную поддержку асинхронного программирования и полную совместимость, делая процесс разработки более эффективным и приятным.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
1