Bagaimana Anda mendefinisikan metode ekstensi statis di Kotlin? Apakah ini mungkin? Saat ini saya memiliki metode ekstensi seperti yang ditunjukkan di bawah ini.
public fun Uber.doMagic(context: Context) {
// ...
}
Ekstensi di atas dapat dipanggil pada sebuah instance.
uberInstance.doMagic(context) // Instance method
tapi bagaimana cara membuatnya menjadi metode statis seperti gambar di bawah ini.
Uber.doMagic(context) // Static or class method
static-methods
kotlin
Ragunath Jawahar
sumber
sumber
Jawaban:
Untuk mencapai
Uber.doMagic(context)
, Anda dapat menulis ekstensi ke objek pendamping dariUber
(deklarasi pendamping objek diperlukan):class Uber { companion object {} } fun Uber.Companion.doMagic(context: Context) { }
sumber
Inilah yang dikatakan dalam dokumentasi resmi:
Metode statis Kotlin
class C { companion object { @JvmStatic fun foo() {} fun bar() {} } }
C.foo(); // works fine C.bar(); // error: not a static method
sumber
Saya sebenarnya memiliki pertanyaan ini 30 menit yang lalu, jadi saya mulai mencari-cari dan tidak dapat menemukan solusi atau solusi untuk ini, TAPI saat mencari saya menemukan bagian ini di situs web Kotlinglang yang menyatakan bahwa:
Jadi saya punya ide paling gila, mengapa tidak mendefinisikan fungsi ekstensi dengan penerima nullable (tanpa benar-benar menggunakan receiver itu) dan kemudian menyebutnya pada objek null! Jadi saya mencobanya, dan berhasil dengan baik, tetapi terlihat sangat jelek. Seperti ini:
(null as Type?).staticFunction(param1, param2)
Jadi saya mengatasinya dengan membuat val di file ekstensi saya dari jenis penerima yang memiliki nilai null dan kemudian menggunakannya di kelas saya yang lain. Jadi, sebagai contoh, berikut adalah cara saya mengimplementasikan fungsi ekstensi "statis" untuk
Navigation
kelas di Android: Dalam file NavigationExtensions.kt saya:val SNavigation: Navigation? = null fun Navigation?.createNavigateOnClickListener(@IdRes resId: Int, args: Bundle? = null, navOptions: NavOptions? = null, navigationExtras: Navigator.Extras? = null) : (View) -> Unit { //This is just implementation details, don't worry too much about them, just focus on the Navigation? part in the method declaration return { view: View -> view.navigate(resId, args, navOptions, navigationExtras) } }
Dalam kode yang menggunakannya:
Jelas, ini bukan nama kelas, ini hanya variabel dari jenis kelas yang memiliki nilai null. Ini jelas jelek di sisi pembuat ekstensi (karena mereka harus membuat variabel) dan di sisi pengembang (karena mereka harus menggunakan
SType
format alih-alih nama kelas yang sebenarnya), tetapi ini adalah yang terdekat yang dapat dicapai saat ini dibandingkan dengan fungsi statis sebenarnya. Semoga pembuat bahasa Kotlin akan merespon masalah yang dibuat dan menambahkan fitur tersebut ke dalam bahasa tersebut.sumber
Anda dapat membuat metode statis dengan menggunakan objek Companion seperti:
class Foo { // ... companion object { public fun bar() { // do anything } } }
dan kemudian Anda bisa menyebutnya seperti:
class Baz { // ... private fun callBar() { Foo.bar() } }
sumber
platformStatic
anotasi.platformStatic
diubah namanyaJvmStatic
di Kotlin saat ini.Sarankan Anda untuk melihat tautan ini . Seperti yang Anda lihat di sana, Anda hanya harus mendeklarasikan metode di tingkat teratas dari paket (file):
package strings public fun joinToString(...): String { ... }
Ini sama dengan
package strings; public class JoinKt { public static String joinToString(...) { ... } }
Dengan konstanta semuanya sama. Deklarasi ini
val UNIX_LINE_SEPARATOR = "\n"
adalah sama dengan
public static final String UNIX_LINE_SEPARATOR = "\n";
sumber
Saya juga sangat menyukai kemungkinan untuk menambahkan metode ekstensi statis di Kotlin. Sebagai solusi untuk saat ini saya menambahkan metode exntension ke beberapa kelas daripada menggunakan satu metode ekstensi statis di semuanya.
class Util fun Util.isDeviceOnline(context: Context): Boolean { val connMgr = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkInfo = connMgr.activeNetworkInfo return networkInfo != null && networkInfo.isConnected } fun Activity.isDeviceOnline(context: Context) = { Util().isDeviceOnline(context) } fun OkHttpClient.isDeviceOnline(context: Context) = { Util().isDeviceOnline(context) }
sumber
Activity.isDeviceOnline(...)
tanpa harus memiliki contohActivity
.Untuk membuat metode ekstensi di kotlin Anda harus membuat file kotlin (bukan kelas) kemudian mendeklarasikan metode Anda di file tersebut Misalnya:
public fun String.toLowercase(){ // **this** is the string object }
Impor fungsi di kelas atau file yang sedang Anda kerjakan dan gunakan.
sumber