Bagaimana direkomendasikan untuk membuat konstanta di Kotlin? Dan apa konvensi penamaannya? Saya belum menemukan itu di dokumentasi.
companion object {
//1
val MY_CONST = "something"
//2
const val MY_CONST = "something"
//3
val myConst = "something"
}
Atau ...?
public static final
bidang di Jawa, gunakanconst val
objek pendamping Anda. Jika Anda inginprivate static final
bidang dan pengambil publik, gunakanval
objek pendamping Anda.Jawaban:
Di Kotlin, jika Anda ingin membuat konstanta lokal yang seharusnya digunakan di kelas maka Anda dapat membuatnya seperti di bawah ini
Dan jika Anda ingin membuat konstanta publik di kotlin seperti final statis publik di java, Anda dapat membuatnya sebagai berikut.
sumber
Constants.kt
atau bagaimana?companion object
jawaban Ipiotrpo yang saya pikir harus diterimaHindari menggunakan benda pengiring. Di balik tenda, metode instance pengambil dan penyetel dibuat agar bidang dapat diakses. Memanggil metode instance secara teknis lebih mahal daripada memanggil metode statis.
Alih-alih mendefinisikan konstanta di
object
.Latihan yang disarankan :
dan mengaksesnya secara global seperti ini:
DbConstants.TABLE_USER_ATTRIBUTE_EMPID
sumber
const val
dalam objek pengiring dapat berbeda dariconst val
dalam objek biasa (yaitu satu-satunya perbedaan antara contoh Anda tampaknya adalah bahwa Anda dihilangkanconst
dalam case objek pengiring - jika Anda menambahkanconst
, contoh harus memiliki kinerja yang sama)const val
s, menyatakancompanion object
benar.Pertama-tama , konvensi penamaan di Kotlin untuk konstanta sama dengan di java (mis: MY_CONST_IN_UPPERCASE).
Bagaimana saya membuatnya?
1. Sebagai nilai tingkat atas (disarankan)
Anda hanya perlu meletakkan const Anda di luar deklarasi kelas Anda.
Dua kemungkinan : Nyatakan const Anda di file kelas Anda (const Anda memiliki hubungan yang jelas dengan kelas Anda)
Buat file constants.kt khusus tempat menyimpan const global itu (Di sini Anda ingin menggunakan const Anda secara luas di seluruh proyek Anda):
Maka Anda hanya perlu mengimpornya di tempat yang Anda perlukan:
2. Deklarasikan dalam objek pengiring (atau deklarasi objek)
Ini jauh lebih bersih karena di bawah kap, ketika bytecode dihasilkan, objek yang tidak berguna dibuat:
Lebih buruk lagi jika Anda mendeklarasikannya sebagai val daripada const (kompiler akan menghasilkan objek yang tidak berguna + fungsi yang tidak berguna):
Catatan :
Di kotlin, const hanya bisa menampung tipe primitif. Jika Anda ingin meneruskan fungsi ke dalamnya, Anda perlu menambahkan penjelasan @JvmField. Pada waktu kompilasi, itu akan berubah sebagai variabel final statis publik. Tapi ini lebih lambat daripada dengan tipe primitif. Cobalah menghindarinya.
sumber
Nilai yang diketahui pada waktu kompilasi dapat (dan menurut saya harus) ditandai sebagai konstan.
Konvensi penamaan harus mengikuti yang Java dan harus terlihat dengan benar ketika digunakan dari kode Java (entah bagaimana sulit untuk dicapai dengan objek pendamping, tetapi bagaimanapun juga).
Deklarasi konstan yang tepat adalah:
sumber
Naming conventions should follow Java ones
- mengapaIf in doubt, default to the Java Coding Conventions
Anda tidak perlu kelas, objek atau objek pendamping untuk mendeklarasikan konstanta di Kotlin. Anda bisa mendeklarasikan file yang memegang semua konstanta (misalnya Constants.kt atau Anda juga bisa meletakkannya di dalam file Kotlin yang ada) dan secara langsung mendeklarasikan konstanta di dalam file. Konstanta yang diketahui pada waktu kompilasi harus ditandai dengan
const
.Jadi, dalam hal ini, seharusnya:
const val MY_CONST = "something"
dan kemudian Anda dapat mengimpor konstanta menggunakan:
import package_name.MY_CONST
Anda bisa merujuk ke tautan ini
sumber
Jika Anda meletakkan
const val valName = valValue
sebelum nama kelas, cara ini akan membuat apublic static final YourClass.Kt
yang akan memilikipublic static final
nilai.Kotlin :
Java didekompilasi:
sumber
Anda memiliki dua pilihan, Anda dapat menggunakan
const
kata kunci atau menggunakan@JvmField
yang membuatnya menjadi konstanta akhir statis java.Jika Anda menggunakan
@JvmField
anotasi maka setelah dikompilasi konstanta akan dimasukkan untuk Anda seperti yang Anda sebut dalam java.Sama seperti Anda akan menyebutnya dalam java kompiler akan menggantikannya untuk Anda ketika Anda memanggil konstanta pengiring dalam kode.
Namun, jika Anda menggunakan kata kunci const maka nilai konstanta menjadi inline. Secara inline maksud saya nilai aktual digunakan setelah dikompilasi.
jadi untuk meringkas di sini adalah apa yang kompiler akan lakukan untuk Anda:
sumber
Nilai & metode statis dan konstan diumumkan
}
Nilai akses di mana saja
sumber
Seperti
val
, variabel yang didefinisikan denganconst
kata kunci tidak dapat diubah. Perbedaannya di sini adalah yangconst
digunakan untuk variabel yang dikenal pada waktu kompilasi.Mendeklarasikan variabel
const
sangat mirip dengan menggunakanstatic
kata kunci di Jawa.Mari kita lihat bagaimana mendeklarasikan variabel const di Kotlin:
Dan kode analog yang ditulis dalam Java adalah:
Menambah jawaban di atas -
Bidang statis
Biasanya bidang ini bersifat pribadi tetapi dapat diekspos dengan salah satu cara berikut:
@JvmField
anotasi;lateinit
pengubah;const
pengubah.Lebih detail di sini - https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields
sumber
Sesuatu yang tidak disebutkan dalam jawaban mana pun adalah kelebihan penggunaan
companion objects
. Seperti yang dapat Anda baca di sini , objek pengiring sebenarnya adalah objek dan membuatnya menghabiskan sumber daya. Selain itu, Anda mungkin harus melalui lebih dari satu fungsi pengambil setiap kali Anda menggunakan konstanta Anda. Jika yang Anda butuhkan hanyalah beberapa konstanta primitif, Anda mungkin akan lebih baik menggunakanval
untuk mendapatkan kinerja yang lebih baik dan menghindaricompanion object
.TL; DR; artikel:
Menggunakan objek pengiring sebenarnya mengubah kode ini
Ke dalam kode ini:
Jadi cobalah untuk menghindarinya.
sumber
konstanta lokal:
Konstanta global:
akses MyConstants.NAME
sumber
Ada beberapa cara untuk mendefinisikan konstanta di Kotlin,
Menggunakan objek pendamping
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,
Saat Anda membuat konstanta menggunakan objek pengiring, dan melihat bytecode yang di-decompile , Anda akan menemukan sesuatu seperti di bawah ini,
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,
Sekali lagi jika Anda melihat versi kode byte byte yang di-dekompilasi, Anda akan menemukan sesuatu seperti ini,
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,
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.
Jadi ini adalah cara terbaik untuk membuat konstanta.
sumber
Untuk primitif dan String:
Untuk kasus lain:
Contoh:
sumber