Kotlin | Вопросы собесов
2.57K subscribers
28 photos
964 links
Download Telegram
🤔 Что такое многопоточность?

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

🚩Основные принципы

🟠Потоки
Это легковесный процесс, который может выполняться независимо. В рамках одного процесса может существовать множество потоков, каждый из которых имеет доступ к ресурсам процесса.

🟠Параллелизм и конкурентность
Позволяет достичь параллелизма (одновременное выполнение) и конкурентности (эффективное переключение между задачами в условиях ограниченных ресурсов).

🟠Синхронизация
Поскольку потоки делят общие ресурсы, возникает необходимость в синхронизации доступа к этим ресурсам, чтобы избежать конфликтов и ошибок, таких как "гонки за ресурсы" (race conditions). Для управления доступом используются различные механизмы синхронизации, такие как мьютексы, семафоры и мониторы.

🟠Мертвая блокировка и голодание
Возникает, когда два или более потоков взаимно блокируют друг друга, ожидая освобождения ресурсов. Голодание происходит, когда один или несколько потоков не получают доступ к необходимым ресурсам в течение длительного времени.

public class MultithreadingExample {
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Поток 1: " + i);
try {
Thread.sleep(50); // Имитация выполнения работы
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});

Thread thread2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Поток 2: " + i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});

thread1.start();
thread2.start();
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Сколько инстансов Unit на одно приложение?

Unit является синглтоном в Kotlin, то есть существует только один экземпляр Unit на всё приложение. Это встроенный тип, используемый для обозначения отсутствия значимого значения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
🤔 В чем преимущества выбора Android разработки?

Выбор Android-разработки предоставляет целый ряд преимуществ, как для разработчиков, так и для бизнеса.

🟠Огромная пользовательская база
Является самой популярной мобильной операционной системой в мире, что обеспечивает доступ к широкой аудитории. Приложения могут достичь значительного числа пользователей по всему миру, увеличивая потенциальные рыночные возможности.

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

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

🟠Поддержка многочисленных устройств
Работает на множестве устройств с различными размерами экрана и характеристиками, что дает возможность охватить более широкий спектр рынка. Однако это также создает вызовы, связанные с адаптацией приложений под разные устройства.

🟠Интеграция с Google Services
Тесно интегрирован с Google Services, такими как Google Drive, Google Maps и другими. Это предоставляет легкий доступ к мощным инструментам и API, которые могут значительно расширить функциональность приложений.

🟠Разнообразие распространения и монетизации
Приложения можно распространять не только через Google Play Market. Существуют альтернативные магазины приложений и платформы, что предоставляет больше вариантов монетизации и распространения своих продуктов.

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
🤔 Сколько типов инстансов у Nothing?

Nothingне имеет инстансов. Это тип, который обозначает, что значение никогда не будет возвращено (например, функция завершает выполнение с исключением).

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
🤔 Как передать данные с одной Activity на другую?

В Android передача данных между Activity осуществляется через механизм Intent. Intent — это объект, который позволяет передавать данные и запускать компоненты, такие как Activity, Service и BroadcastReceiver.

🚩Передача данных с одной Activity на другую

🟠Передача данных через Intent
1⃣Создание Intent и добавление данных
В первой Activity создайте Intent и добавьте данные, которые хотите передать, используя методы putExtra.
// MainActivity.java
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("key", "value"); // передаем строку
intent.putExtra("number", 123); // передаем целое число
startActivity(intent);


2⃣Получение данных во второй Activity
Во второй Activity получите Intent, который запустил эту Activity, и извлеките данные из него.
// SecondActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);

// Получение Intent и извлечение данных
Intent intent = getIntent();
String value = intent.getStringExtra("key");
int number = intent.getIntExtra("number", 0); // 0 - значение по умолчанию

// Использование полученных данных
TextView textView = findViewById(R.id.textView);
textView.setText("String: " + value + ", Number: " + number);
}


🟠Передача объектов (Parcelable)
Если вам нужно передать сложные объекты, вы можете использовать интерфейс Parcelable. Этот интерфейс позволяет сериализовать объекты для передачи через Intent.

1⃣Создание класса, реализующего Parcelable
import android.os.Parcel;
import android.os.Parcelable;

public class User implements Parcelable {
private String name;
private int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

protected User(Parcel in) {
name = in.readString();
age = in.readInt();
}

public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}

@Override
public User[] newArray(int size) {
return new User[size];
}
};

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeInt(age);
}

// Getters and setters (если нужны)
}


2⃣Передача объекта через Intent
// MainActivity.java
User user = new User("John", 30);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("user", user);
startActivity(intent);


3⃣Получение объекта во второй Activity
// SecondActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);

Intent intent = getIntent();
User user = intent.getParcelableExtra("user");

// Использование полученного объекта
if (user != null) {
TextView textView = findViewById(R.id.textView);
textView.setText("Name: " + user.getName() + ", Age: " + user.getAge());
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
🤔 Как происходит составление хешмапы, если совпадает хеш-код?

Если два ключа имеют одинаковый хеш-код (коллизия), используются механизмы разрешения:
1. Связанные списки (chaining): элементы с одинаковым хешем помещаются в один bucket в виде связанного списка.
2. Сбалансированные деревья: современные реализации (например, в Java) используют деревья вместо списков для ускорения поиска при большом количестве коллизий.
3. Метод equals используется для проверки уникальности ключей в случае совпадения хеша.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
🤔 Какие особенности инжекта в поле при помощи Dagger?

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

🚩Основные особенности инжекта в поле при помощи Dagger

🟠Автоматическое управление зависимостями
Dagger автоматически управляет созданием и предоставлением экземпляров зависимостей, что упрощает и улучшает структуру кода.

🟠Меньше шаблонного кода
Использование Dagger позволяет избежать написания большого количества шаблонного кода, связанного с созданием и управлением зависимостями вручную.

🟠Области видимости (Scopes)
Dagger поддерживает различные области видимости (например, @Singleton), что позволяет контролировать жизненный цикл зависимостей.

🟠Упрощение тестирования
Внедрение зависимостей через Dagger упрощает тестирование кода, так как зависимости можно легко замокать (заменить на тестовые версии).

🚩Как это используется

1⃣Определить зависимости и указать, как они должны быть созданы.
2⃣Настроить Dagger-компонент, который будет управлять этими зависимостями.
3⃣Использовать аннотацию @Inject для полей, в которые нужно внедрить зависимости.

🚩Пример использования

1⃣Создание модуля зависимостей
import dagger.Module;
import dagger.Provides;

@Module
public class NetworkModule {

@Provides
@Singleton
public NetworkService provideNetworkService() {
return new NetworkServiceImpl();
}
}


2⃣Определение компонента
import dagger.Component;

import javax.inject.Singleton;

@Singleton
@Component(modules = {NetworkModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
}


3⃣Инжект в поле
import javax.inject.Inject;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

@Inject
NetworkService networkService;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Получение компонента и инжект зависимостей
((MyApplication) getApplication()).getAppComponent().inject(this);

// Теперь networkService можно использовать
networkService.performRequest();
}
}


4⃣Инициализация Dagger в приложении
import android.app.Application;

public class MyApplication extends Application {

private AppComponent appComponent;

@Override
public void onCreate() {
super.onCreate();

// Создание Dagger-компонента
appComponent = DaggerAppComponent.builder()
.networkModule(new NetworkModule())
.build();
}

public AppComponent getAppComponent() {
return appComponent;
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Можно ли на уровне компилятора сделать все функции inline?

Нет, не все функции можно сделать на уровне компилятора:
1. Компилятор принимает решение на основе размера функции и оптимизации производительности.
2. Рекурсивные функции или сложные конструкции не могут быть встроены, так как это может вызвать ошибки или увеличенный размер кода.
3. Принудительное использование inline директив возможно, но это не всегда эффективно.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2😁2
🤔 Когда инициализируется companion object?

В Kotlin, companion object (объект-компаньон) используется для создания статических членов класса. Этот объект инициализируется при первом доступе к нему.

🚩Особенности инициализации `companion object`

🟠Ленивая инициализация
companion object инициализируется лениво, то есть при первом обращении к любому из его членов. Это помогает избежать ненужных затрат ресурсов до тех пор, пока эти члены не понадобятся.

🟠Статическая инициализация
По сути, companion object работает как статический объект в Java, предоставляя статические методы и свойства.

Пример использования
class MyClass {
companion object {
val staticProperty: String = "Hello, World!"

fun staticMethod() {
println("Static Method Called")
}

init {
println("Companion object is initialized")
}
}
}


Пример инициализации
fun main() {
println("Before accessing companion object")

// Первое обращение к companion object
println(MyClass.staticProperty)

// Еще одно обращение к companion object
MyClass.staticMethod()
}


Вывод программы
Before accessing companion object
Companion object is initialized
Hello, World!
Static Method Called


🚩Дополнительные особенности

🟠Может иметь имя
companion object можно называть, что позволяет иметь несколько объектов-компаньонов в одном классе, хотя это редко используется.
class MyClass {
companion object NamedCompanion {
// Члены и методы
}
}


🟠Реализация интерфейсов
companion object может реализовывать интерфейсы.
interface MyInterface {
fun doSomething()
}

class MyClass {
companion object : MyInterface {
override fun doSomething() {
println("Doing something")
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔Как отловить самую раннюю точку захода в приложение?

1. Для Android точка входа — это метод onCreate класса Application. Его можно переопределить для выполнения начальной логики.
2. В некоторых случаях может понадобиться использование ContentProvider, который инициализируется до Application.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2🤯1
🤔 Какие базы данных можно использовать в Android?

В Android приложениях можно использовать различные базы данных для хранения данных.

🟠SQLite
Является встроенной реляционной базой данных, которая поставляется вместе с Android. Это легковесная база данных, не требующая настройки сервера.

Плюсы и минусы
Легковесность и встроенность в Android.
Поддержка большинства SQL-операций.
Простота использования через API.
Ограниченные возможности по сравнению с полноценными СУБД.
Требует написания SQL-запросов вручную.

public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "mydatabase.db";
private static final int DATABASE_VERSION = 1;

public MyDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE mytable (id INTEGER PRIMARY KEY, name TEXT)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS mytable");
onCreate(db);
}
}


🟠Room
Это библиотека, предоставляющая слой абстракции поверх SQLite. Она облегчает работу с базой данных, предоставляя удобный API и поддержку проверки запросов во время компиляции.

Плюсы и минусы
Простота использования и настройка.
Поддержка проверки запросов во время компиляции.
Интеграция с LiveData и RxJava.
Требует добавления зависимости и конфигурации.

Пример использования
@Entity
public class User {
@PrimaryKey
public int uid;
public String firstName;
public String lastName;
}

@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();

@Insert
void insertAll(User... users);
}

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}


🟠Realm
Это современная база данных, созданная специально для мобильных приложений. Она имеет собственный движок и API, отличное от традиционных реляционных баз данных.

Плюсы и минусы
Высокая производительность.
Простота использования и установка.
Реактивные обновления данных.
Больший размер библиотеки.
Ограниченная поддержка некоторых SQL-функций.

Пример использования
public class User extends RealmObject {
@PrimaryKey
private int id;
private String name;

// getters and setters
}

// Использование
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = realm.createObject(User.class, 1);
user.setName("John Doe");
}
});


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Что можно положить в Bundle?

Можно передавать примитивные типы данных и сериализуемые объекты:
1. Примитивы: int, float, boolean, double.
2. Строки и массивы примитивов.
3. Сериализуемые или Parcelable объекты.
4. Для больших данных, например, файлов, лучше использовать ссылки или путь к данным.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
🤔 Как работает стек?

Это абстрактная структура данных, работающая по принципу "последний вошел — первый вышел" (LIFO, Last In First Out). Это означает, что последний добавленный элемент будет первым, который будет удален.

🟠push
добавление элемента на вершину стека.
🟠pop
удаление элемента с вершины стека.

🚩Принцип работы стека

🟠push(item)
добавляет элемент item на вершину стека.
🟠pop()
удаляет и возвращает элемент с вершины стека.
🟠peek()
возвращает элемент на вершине стека, но не удаляет его.
🟠isEmpty()
проверяет, пуст ли стек.
🟠size()
возвращает количество элементов в стеке.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Как правильно передать большой объем данных, например, картинку, в Activity?

1. Вместо передачи данных через Intent или Bundle, сохраняйте данные в файловую систему, кэш или базу данных.
2. Передавайте только ссылку (путь) на данные.
3. Используйте механизмы, такие как URI или ContentProvider, для безопасного доступа к большим данным. Это предотвратит ошибки превышения размера данных в Intent.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2
🤔 Какие есть ограничения у sealed классов?

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

🚩Ограничения sealed классов

🟠Все подтипы должны быть определены в том же файле
Все классы, которые наследуются от sealed класса, должны быть определены в одном файле с самим sealed классом. Это ограничение введено для обеспечения полной контрольной иерархии и предотвращения добавления новых подтипов в другом месте.
sealed class Result {
class Success(val data: String) : Result()
class Error(val exception: Exception) : Result()
}


🟠Sealed класс не может быть интерфейсом
Sealed класс не может быть интерфейсом. Если вам нужно определить ограниченную иерархию интерфейсов, вы должны использовать обычные интерфейсы и sealed классы вместе.

🟠Sealed класс не может быть абстрактным классом напрямую
Хотя sealed классы и являются абстрактными по своей природе (их нельзя напрямую инстанцировать), они не могут быть явно помечены как abstract.

🟠Ограничение видимости
Sealed классы и их подтипы не могут быть private. Они должны быть либо public, либо internal, чтобы их можно было использовать в рамках всего файла иерархии.

🟠Sealed классы не поддерживают наследование от других классов
Sealed класс не может наследоваться от другого класса, кроме Any. Это связано с тем, что sealed классы уже имеют специфическое предназначение и их иерархия должна быть полностью определена в одном месте.

🟠Могут использоваться только для классов и объектов, но не интерфейсов
Sealed классы могут быть использованы для классов и объектов, но не могут использоваться для определения интерфейсов.

sealed class Operation {
class Addition(val value: Int) : Operation()
class Subtraction(val value: Int) : Operation()
object NoOp : Operation()
}

fun execute(operation: Operation, base: Int): Int {
return when (operation) {
is Operation.Addition -> base + operation.value
is Operation.Subtraction -> base - operation.value
Operation.NoOp -> base
}
}


🚩Плюсы

Компилятор знает все подтипы
Это позволяет использовать исчерпывающие выражения when, которые не требуют блока else, если все подтипы покрыты.
Полный контроль над иерархией классов
Это делает код более предсказуемым и безопасным.
Поддержка сопоставления с образцом (pattern matching)
Это делает код более читаемым и менее подверженным ошибкам.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
🤔 Зачем нужен `reified`?

reified используется с inline-функциями в Kotlin для сохранения типа во время выполнения, что позволяет работать с типами без явного указания Class<T>.
1. Это нужно, чтобы избегать рефлексии и писать более читаемый код.
2. Пример: фильтрация элементов коллекции по типу list.filterIsInstance<T>().


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍2
🤔 Что при создании классов в Kotlin изменились по сравнению с Java?

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

🚩Объявление классов и конструкторов

В Kotlin объявление классов и их конструкторов значительно упрощено.
В Java
public class Person {
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public int getAge() {
return age;
}
}


В Kotlin
class Person(val name: String, val age: Int)


🟠Статические члены
В Java для объявления статических членов используется ключевое слово static. В Kotlin вместо этого используются companion object.
В Java
public class MyClass {
public static final String CONSTANT = "constant";

public static void staticMethod() {
// Some code
}
}


В Kotlin
class MyClass {
companion object {
const val CONSTANT = "constant"

@JvmStatic
fun staticMethod() {
// Some code
}
}
}


🟠Data классы
Kotlin предоставляет специальный тип классов — data классы, которые автоматически генерируют методы equals(), hashCode(), toString(), copy(), и componentN().
В Java
public class User {
private String name;
private int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public boolean equals(Object o) {
// Implementation
}

@Override
public int hashCode() {
// Implementation
}

@Override
public String toString() {
// Implementation
}
}


В Kotlin
data class User(val name: String, val age: Int)


🟠Свойства и методы доступа
В Kotlin свойства объявляются напрямую, и методы доступа (геттеры и сеттеры) генерируются автоматически.
В Java
public class Rectangle {
private int width;
private int height;

public int getWidth() {
return width;
}

public void setWidth(int width) {
this.width = width;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}
}


В Kotlin
class Rectangle(var width: Int, var height: Int)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Что известно о спец. типах?

1. Unit: аналог void, но используется как возвращаемый тип функций.
2. Nothing: указывает, что функция никогда не завершится успешно (например, выбрасывает исключение).
3. Any: корневой тип для всех объектов в Kotlin.
4. Nullable типы: добавляют ?, чтобы разрешить null в значении.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3
🤔 Что происходит с полями из супер-класса при наследовании data-класса?

При наследовании data class от какого-либо суперкласса в Kotlin, важно понимать, как работают свойства (поля) суперкласса и как они влияют на функциональность и структуру data class.

🚩Что происходит с полями суперкласса

🟠Наследование свойств
Поля (свойства), объявленные в суперклассе, автоматически становятся доступными в классе-наследнике. Вы можете использовать их в наследуемом классе как обычно. Однако свойства суперкласса не участвуют в автоматически сгенерированных функциях equals(), hashCode(), и toString() для data class.

🟠Автоматически сгенерированные функции в data-классе
У data class Kotlin генерирует функции equals(), hashCode(), toString(), copy() и другие. Эти функции работают только с параметрами, объявленными в первичном конструкторе data-класса. Поля, которые находятся в суперклассе, не участвуют в этих функциях.

🟠Почему поля суперкласса игнорируются
Это связано с тем, что контракт data class предполагает, что все его ключевые данные (data) определяются только параметрами первичного конструктора. Это позволяет гарантировать, что две одинаковые сущности будут сравниваться и обрабатываться корректно, основываясь только на данных самого data class.

// Суперкласс с полем name
open class Person(val name: String)

// Наследуемый data-класс
data class Employee(val id: Int, val position: String) : Person(name = "Default")


val employee1 = Employee(1, "Developer")
val employee2 = Employee(1, "Developer")

println(employee1 == employee2) // true, так как сравнение основано только на id и position
println(employee1.toString()) // Employee(id=1, position=Developer)


🟠Если нужно включить поля суперкласса в сравнение
Если вы хотите, чтобы поля суперкласса учитывались в логике equals() или hashCode(), вам нужно переопределить эти функции вручную.
data class Employee(val id: Int, val position: String) : Person(name = "Default") {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is Employee || !super.equals(other)) return false
return id == other.id && position == other.position && name == other.name
}

override fun hashCode(): Int {
return 31 * super.hashCode() + id.hashCode() + position.hashCode()
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
🤔 Что объединяет основные компоненты Android-приложения?

Все компоненты Android (Activity, Service, BroadcastReceiver, ContentProvider) управляются системой через Context.
1. Они взаимодействуют через Intent, который передаёт команды и данные.
2. Каждый компонент регистрируется в AndroidManifest.xml.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍7