Є кілька способів визначити константи в Котліні,
Використання супутнього об’єкта
companion object {
const val ITEM1 = "item1"
const val ITEM2 = "item2"
}
ви можете використовувати вищевказаний об'єктний блок всередині будь-якого класу та визначити всі ваші поля всередині цього блоку. Але в цьому підході є проблема, документація говорить:
незважаючи на те, що члени об'єктів-супутників схожі на статичні члени іншими мовами, під час виконання вони все ще є членами екземплярів реальних об'єктів і можуть, наприклад, реалізувати інтерфейси.
Коли ви створюєте константи за допомогою супутнього об’єкта і бачите розкомпільований байт-код , ви будете щось схоже нижче
ClassName.Companion Companion = ClassName.Companion.$$INSTANCE;
@NotNull
String ITEM1 = "item1";
@NotNull
String ITEM2 = "item2";
public static final class Companion {
@NotNull
private static final String ITEM1 = "item1";
@NotNull
public static final String ITEM2 = "item2";
// $FF: synthetic field
static final ClassName.Companion $$INSTANCE;
private Companion() {
}
static {
ClassName.Companion var0 = new ClassName.Companion();
$$INSTANCE = var0;
}
}
Звідси ви легко бачите, що сказано в документації, навіть якщо члени супутніх об'єктів виглядають як статичні члени на інших мовах, під час виконання вони все ще є членами екземплярів реальних об'єктів. Це робить додаткову роботу, ніж потрібно.
Тепер з'явився інший спосіб, коли нам не потрібно використовувати супутні об'єкти, як показано нижче,
object ApiConstants {
val ITEM1: String = "item1"
}
Знову, якщо ви побачите декомпільовану версію байтового коду вищевказаного фрагмента, ви знайдете щось подібне,
public final class ApiConstants {
private static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
public final String getITEM1() {
return ITEM1;
}
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
CONNECT_TIMEOUT = "item1";
}
}
Тепер, якщо ви бачите вищезгаданий декомпільований код, він створює метод get для кожної змінної. Цей метод отримання взагалі не потрібен.
Щоб позбутися цих методів отримання , слід використовувати const перед вал, як нижче,
object ApiConstants {
const val ITEM1: String = "item1"
}
Тепер, якщо ви побачите декомпільований код вище фрагменту, вам буде легше його прочитати, оскільки це робить найменше фонове перетворення для вашого коду.
public final class ApiConstants {
public static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
}
}
Тож це найкращий спосіб створення констант.
public static final
полі на Java, використовуйтеconst val
в своєму супутниковому об'єкті. Якщо ви хочетеprivate static final
польовий і загальнодоступний користувач, використовуйтеval
у своєму супутниковому об’єкті.