Ada beberapa cara untuk mendefinisikan konstanta di Kotlin,
Menggunakan objek pendamping
companion object {
const val ITEM1 = "item1"
const val ITEM2 = "item2"
}
Anda bisa menggunakan blok objek pengiring di atas di dalam kelas apa pun dan mendefinisikan semua bidang Anda di dalam blok ini sendiri. Tetapi ada masalah dengan pendekatan ini, dokumentasi mengatakan,
meskipun anggota objek pendamping terlihat seperti anggota statis dalam bahasa lain, pada saat runtime mereka masih menjadi anggota objek nyata, dan dapat, misalnya, mengimplementasikan antarmuka.
Saat Anda membuat konstanta menggunakan objek pengiring, dan melihat bytecode yang di-decompile , Anda akan menemukan sesuatu seperti di bawah ini,
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;
}
}
Dari sini Anda dapat dengan mudah melihat apa yang dikatakan dokumentasi, meskipun anggota objek pendamping terlihat seperti anggota statis dalam bahasa lain, pada saat runtime mereka masih menjadi contoh anggota objek nyata. Ini melakukan pekerjaan ekstra daripada yang diperlukan.
Sekarang datang cara lain, di mana kita tidak perlu menggunakan objek pendamping seperti di bawah ini,
object ApiConstants {
val ITEM1: String = "item1"
}
Sekali lagi jika Anda melihat versi kode byte byte yang di-dekompilasi, Anda akan menemukan sesuatu seperti ini,
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";
}
}
Sekarang jika Anda melihat kode dekompilasi di atas, itu membuat metode get untuk setiap variabel. Metode get ini tidak diperlukan sama sekali.
Untuk menghilangkan metode get ini , Anda harus menggunakan const sebelum val seperti di bawah ini,
object ApiConstants {
const val ITEM1: String = "item1"
}
Sekarang jika Anda melihat kode yang dikompilasi dari cuplikan di atas, Anda akan lebih mudah membaca karena ia melakukan konversi latar belakang paling sedikit untuk kode Anda.
public final class ApiConstants {
public static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
}
}
Jadi ini adalah cara terbaik untuk membuat konstanta.
public static final
bidang di Jawa, gunakanconst val
objek pendamping Anda. Jika Anda inginprivate static final
bidang dan pengambil publik, gunakanval
objek pendamping Anda.