Maklum: Kotlin telah menghapus statika gaya Java untuk mendorong praktik pengkodean yang lebih mudah dikelola (berani saya katakan 'lebih baik'). Global statis umumnya menentang paradigma OOP tetapi mereka bisa sangat nyaman. Karenanya, Kotlin telah memberi kami teman, cara statika yang lebih ramah terhadap OOP.
Nicholas Miller
Kotlin sekarang bahasa pilihan untuk pengembangan Android, menurut Google.
AFD
@NicholasMiller mengapa lebih ramah-OOP? Saya pikir lebih mudah untuk membaca dan menulis tanpa catatan statis (boilerplate) berulang. Atau adakah alasan bagus lainnya?
Torben G
Jawaban:
889
Anda menempatkan fungsi di "objek pengiring".
Jadi kode java seperti ini:
classFoo{publicstaticint a(){return1;}}
akan menjadi
classFoo{
companion object{
fun a():Int=1}}
Anda kemudian dapat menggunakannya dari dalam kode Kotlin sebagai
Foo.a();
Tetapi dari dalam kode Java, Anda harus menyebutnya sebagai
Foo.Companion.a();
(Yang juga bekerja dari dalam Kotlin.)
Jika Anda tidak suka harus menentukan Companionbit, Anda bisa menambahkan @JvmStaticanotasi atau memberi nama kelas rekan Anda.
Deklarasi objek di dalam kelas dapat ditandai dengan kata kunci pengiring:
classMyClass{
companion objectFactory{
fun create():MyClass=MyClass()}}
Anggota objek pendamping dapat dipanggil dengan hanya menggunakan nama kelas sebagai kualifikasi:
val instance =MyClass.create()
...
Namun, pada JVM Anda dapat memiliki anggota objek pendamping yang dihasilkan sebagai metode dan bidang statis nyata, jika Anda menggunakan @JvmStatic
anotasi. Lihat bagian interoperabilitas Java untuk lebih jelasnya.
Menambahkan @JvmStaticanotasi terlihat seperti ini
classFoo{
companion object{@JvmStatic
fun a():Int=1;}}
dan kemudian akan ada sebagai fungsi statis Java nyata, dapat diakses dari Java dan Kotlin sebagai Foo.a().
Jika itu hanya tidak disukai untuk Companionnama, maka Anda juga dapat memberikan nama eksplisit untuk objek pendamping terlihat seperti ini:
classFoo{
companion objectBlah{
fun a():Int=1;}}
yang akan membiarkan Anda memanggilnya dari Kotlin dengan cara yang sama, tetapi dari java like Foo.Blah.a()(yang juga akan bekerja di Kotlin).
Di Kotlin akan fun a(): Int { return 1 }atau bahkanfun a(): Int = 1
Dmitry Zaytsev
3
@DmitryZaitsev atau genap fun a() = 1.
Moira
Apa arti Factory?
Bagus Aji Santoso
@BagusAjiSantoso Factoryadalah nama objek pendamping - tapi untuk apa itu bisa digunakan? Saya tidak tahu, tapi saya tertarik jadi saya membuat pertanyaan yang didedikasikan untuk itu: stackoverflow.com/q/45853459/221955 .
Michael Anderson
1
@ Yajairo87 Saya pikir apa yang Anda minta terlalu banyak untuk dibahas dalam komentar di sini - jadi saya telah membuat pertanyaan untuk mengatasinya secara langsung: stackoverflow.com/questions/47046474/…
Michael Anderson
154
Docs merekomendasikan untuk menyelesaikan sebagian besar kebutuhan untuk fungsi statis dengan fungsi tingkat paket . Mereka hanya dideklarasikan di luar kelas dalam file kode sumber. Paket file dapat ditentukan di awal file dengan kata kunci paket.
Pernyataan
package foo
fun bar()={}
Pemakaian
import foo.bar
kalau tidak
import foo.*
Anda sekarang dapat memanggil fungsi dengan:
bar()
atau jika Anda tidak menggunakan kata kunci impor:
foo.bar()
Jika Anda tidak menentukan paketnya, fungsinya akan dapat diakses dari root.
Jika Anda hanya memiliki pengalaman dengan java, ini mungkin tampak sedikit aneh. Alasannya adalah bahwa kotlin bukan bahasa berorientasi objek yang ketat. Bisa dibilang ini mendukung metode di luar kelas.
Sunting: Mereka telah mengedit dokumentasi untuk tidak lagi menyertakan kalimat tentang merekomendasikan fungsi tingkat paket. Ini asli yang disebut di atas.
Perhatikan bahwa di bawah kap fungsi-fungsi "tingkat atas" atau "paket" ini sebenarnya dikompilasi ke dalam kelas mereka sendiri. Dalam contoh di atas, kompiler akan membuat class FooPackagedengan semua properti dan fungsi tingkat atas, dan merutekan semua referensi Anda ke mereka dengan tepat. Info lebih lanjut dari jetbrains.
Mitchell Tracy
29
+1 Untuk menjelaskan cara melakukan hal yang sama di Kotlin daripada hanya mirror yang setara dari Jawa.
phoenix
1
Ini harus menjadi jawaban yang diterima atau mod harus memperbarui jawaban yang diterima untuk memuat fungsi
Osama Shabrez
@MitchellTracy Info yang luar biasa! Terima kasih.
A Droid
1
Ini adalah solusi yang lebih baik sejauh ini. Hanya ingin mengklarifikasi bahwa di mana Anda mendefinisikan fungsi bar()tidak masalah nama file, Anda dapat menamainya BarUtils.ktatau apa pun, maka seperti yang dikatakan teks Anda akan mengimpornya denganimport <package name>.bar
Mariano Ruiz
33
A. Cara Jawa Kuno:
Nyatakan a companion objectuntuk menyertakan metode / variabel statis
classFoo{
companion object{
fun foo()= println("Foo")
val bar ="bar"}}
Gunakan:
Foo.foo()// Outputs Foo
println(Foo.bar)// Outputs bar
B. Cara Kotlin baru
Deklarasikan langsung pada file tanpa kelas pada .ktfile.
fun foo()= println("Foo")
val bar ="bar"
Gunakan methods/variablesdengan nama mereka . ( Setelah mengimpor mereka )
Jika saya mencoba untuk menginisialisasi di beberapa kelas lain yang memberikan java.lang.ExceptionInInitializerError dan saya menggunakan var bukannya val
Sudarshan
4
Metode panggilan harus memiliki INSTANCEkata kunci, seperti ini:Foo.INSTANCE.sayFoo()
Raeglan
Saya pikir solusi ini adalah cara yang disukai jika Anda menginginkan yang static CLASStidak adil static methdos. Karena dengan objek pendamping Anda masih dapat membuat instance kelas induk.
fabriciorissetto
valtidak statis sama dengan static finaldi Jawa
Farid
23
Gunakan objek untuk mewakili val / var / metode untuk membuat statis. Anda dapat menggunakan objek bukan kelas tunggal juga. Anda dapat menggunakan pendamping jika Anda ingin membuat statis di dalam kelas
Sementara cuplikan kode ini mungkin solusinya, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda.
Narendra Jadhav
5
Anda harus melewati objek pengiring untuk metode statis karena kotlin tidak memiliki kata kunci statis - Anggota objek pengiring dapat dipanggil dengan hanya menggunakan nama kelas sebagai kualifikasi:
package xxx
classClassName{
companion object{
fun helloWord(str:String):String{return stringValue
}}}
Untuk penggunaan pertama (yaitu Test.Companion.isCheck(2)) IDE menampilkan peringatan dan ucapkan Companion reference is redundant. Itu bisa dikurangi menjadi Test.isCheck(2)dan bentuk dikurangi lebih dekat dengan setara java.
VSB
3
Kotlin tidak memiliki kata kunci statis. Anda menggunakannya untuk java
Saya ingin menambahkan sesuatu ke jawaban di atas.
Ya, Anda dapat mendefinisikan fungsi dalam file kode sumber (di luar kelas). Tetapi lebih baik jika Anda mendefinisikan fungsi statis di dalam kelas menggunakan Objek Pengiring karena Anda dapat menambahkan lebih banyak fungsi statis dengan memanfaatkan Ekstensi Kotlin .
classMyClass{
companion object{//define static functions here}}//Adding new static function
fun MyClass.Companion.newStaticFunction(){// ...}
Dan Anda dapat memanggil fungsi yang didefinisikan di atas karena Anda akan memanggil fungsi apa pun di dalam Objek Pengiring.
Meskipun ini sedikit lebih dari 2 tahun sekarang, dan punya banyak jawaban bagus, saya melihat beberapa cara lain untuk mendapatkan bidang "statis" Kotlin hilang. Berikut adalah contoh panduan untuk staticinterop Kotlin-Java :
Skenario 1: Membuat metode statis di Kotlin untuk Java
Kotlin
@file:JvmName("KotlinClass")//This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Javapackage com.frybits
classKotlinClass{
companion object{//This annotation tells Java classes to treat this method as if it was a static to [KotlinClass]@JvmStatic
fun foo():Int=1//Without it, you would have to use [KotlinClass.Companion.bar()] to use this method.
fun bar():Int=2}}
Jawa
package com.frybits;classJavaClass{void someFunction(){
println(KotlinClass.foo());//Prints "1"
println(KotlinClass.Companion.bar());//Prints "2". This is the only way to use [bar()] in Java.
println(KotlinClass.Companion.foo());//To show that [Companion] is still the holder of the function [foo()]}//Because I'm way to lazy to keep typing [System.out], but I still want this to be compilable.void println(Object o){System.out.println(o);}}
Jawaban Michael Anderson memberikan kedalaman lebih dari ini, dan pasti harus dijadikan referensi untuk skenario ini.
Skenario berikut ini menangani pembuatan bidang statis di Kotlin sehingga Java tidak harus terus memanggil KotlinClass.foo()kasus-kasus di mana Anda tidak ingin fungsi statis.
Skenario 2: Membuat variabel statis di Kotlin untuk Java
Kotlin
@file:JvmName("KotlinClass")//This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Javapackage com.frybits
classKotlinClass{
companion object{//This annotation tells Kotlin to not generate the getter/setter functions in Java. Instead, this variable should be accessed directly//Also, this is similar to [@JvmStatic], in which it tells Java to treat this as a static variable to [KotlinClass].@JvmFieldvar foo:Int=1//If you want something akin to [final static], and the value is a primitive or a String, you can use the keyword [const] instead//No annotation is needed to make this a field of [KotlinClass]. If the declaration is a non-primitive/non-String, use @JvmField insteadconst val dog:Int=1//This will be treated as a member of the [Companion] object only. It generates the getter/setters for it.var bar:Int=2//We can still use [@JvmStatic] for 'var' variables, but it generates getter/setters as functions of KotlinClass//If we use 'val' instead, it only generates a getter function@JvmStaticvar cat:Int=9}}
Jawa
package com.frybits;classJavaClass{void someFunction(){//Example using @JvmField
println(KotlinClass.foo);//Prints "1"KotlinClass.foo =3;//Example using 'const val'
println(KotlinClass.dog);//Prints "1". Notice the lack of a getter function//Example of not using either @JvmField, @JvmStatic, or 'const val'
println(KotlinClass.Companion.getBar());//Prints "2"KotlinClass.Companion.setBar(3);//The setter for [bar]//Example of using @JvmStatic instead of @JvmField
println(KotlinClass.getCat());KotlinClass.setCat(0);}void println(Object o){System.out.println(o);}}
Salah satu fitur hebat tentang Kotlin adalah Anda dapat membuat fungsi dan variabel tingkat atas. Ini membuatnya greate untuk membuat daftar "classless" dari bidang dan fungsi konstan, yang pada gilirannya dapat digunakan sebagai staticfungsi / bidang di Jawa.
Skenario 3: Mengakses bidang dan fungsi tingkat atas di Kotlin dari Jawa
Kotlin
//In this example, the file name is "KSample.kt". If this annotation wasn't provided, all functions and fields would have to accessed//using the name [KSampleKt.foo()] to utilize them in Java. Make life easier for yourself, and name this something more simple@file:JvmName("KotlinUtils")package com.frybits
//This can be called from Java as [KotlinUtils.TAG]. This is a final static variableconst val TAG ="You're it!"//Since this is a top level variable and not part of a companion object, there's no need to annotate this as "static" to access in Java.//However, this can only be utilized using getter/setter functionsvar foo =1//This lets us use direct access now@JvmFieldvar bar =2//Since this is calculated at runtime, it can't be a constant, but it is still a final static variable. Can't use "const" here.
val GENERATED_VAL:Long="123".toLong()//Again, no need for @JvmStatic, since this is not part of a companion object
fun doSomethingAwesome(){
println("Everything is awesome!")}
Jawa
package com.frybits;classJavaClass{void someFunction(){
println(KotlinUtils.TAG);//Example of printing [TAG]//Example of not using @JvmField.
println(KotlinUtils.getFoo());//Prints "1"KotlinUtils.setFoo(3);//Example using @JvmField
println(KotlinUtils.bar);//Prints "2". Notice the lack of a getter functionKotlinUtils.bar =3;//Since this is a top level variable, no need for annotations to use this//But it looks awkward without the @JvmField
println(KotlinUtils.getGENERATED_VAL());//This is how accessing a top level function looks likeKotlinUtils.doSomethingAwesome();}void println(Object o){System.out.println(o);}}
Disebutkan lain yang dapat digunakan di Jawa sebagai bidang "statis" adalah objectkelas Kotlin . Ini adalah nol parameter kelas tunggal yang dipakai malas saat digunakan pertama kali. Informasi lebih lanjut tentang mereka dapat ditemukan di sini: https://kotlinlang.org/docs/reference/object-declarations.html#object-declarations
Namun, untuk mengakses singleton, sebuah INSTANCEobjek khusus dibuat, yang sama rumitnya untuk ditangani sebagaimana Companionadanya. Berikut cara menggunakan anotasi untuk memberikan kesan bersih staticdi Jawa:
Skenario 4: Menggunakan objectkelas
Kotlin
@file:JvmName("KotlinClass")//This provides a name for this file, so it's not defaulted as [KotlinClassKt] in Javapackage com.frybits
objectKotlinClass{//No need for the 'class' keyword here.//Direct access to this variableconst val foo:Int=1//Tells Java this can be accessed directly from [KotlinClass]@JvmStaticvar cat:Int=9//Just a function that returns the class name@JvmStatic
fun getCustomClassName():String=this::class.java.simpleName +"boo!"//Getter/Setter access to this variable, but isn't accessible directly from [KotlinClass]var bar:Int=2
fun someOtherFunction()="What is 'INSTANCE'?"}
Jawa
package com.frybits;classJavaClass{void someFunction(){
println(KotlinClass.foo);//Direct read of [foo] in [KotlinClass] singleton
println(KotlinClass.getCat());//Getter of [cat]KotlinClass.setCat(0);//Setter of [cat]
println(KotlinClass.getCustomClassName());//Example of using a function of this 'object' class
println(KotlinClass.INSTANCE.getBar());//This is what the singleton would look like without using annotationsKotlinClass.INSTANCE.setBar(23);
println(KotlinClass.INSTANCE.someOtherFunction());//Accessing a function in the object class without using annotations}void println(Object o){System.out.println(o);}}
Untuk membuatnya singkat, Anda bisa menggunakan "objek pengiring" untuk masuk ke dunia statis Kotlin seperti:
companion object{const val TAG ="tHomeFragment"
fun newInstance()=HomeFragment()}
dan untuk membuat bidang konstan gunakan "const val" seperti dalam kode. tetapi cobalah untuk menghindari kelas statis karena membuat kesulitan dalam pengujian unit menggunakan Mockito !.
Konversi yang tepat dari metode java statis untuk setara kotlin akan seperti ini. mis. Di sini kelas util memiliki satu metode statis yang akan setara di kedua java dan kotlin. Penggunaan @JvmStatic penting.
Untuk Android menggunakan string dari satu aktivitas ke semua aktivitas yang diperlukan. Sama seperti statis di java
public final static String TEA_NAME = "TEA_NAME";
Pendekatan Setara di Kotlin:
classMainActivity:AppCompatActivity(){
companion object{const val TEA_NAME ="TEA_NAME"}override fun onCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)}}
@file:JvmName("XxxUtils")package xxx
fun xxx(xxx:Xxx):Yyy= xxx.xxx()
Kedua potongan kode tersebut sama dengan setelah kompilasi (bahkan nama file yang dikompilasi, file:JvmNamedigunakan untuk mengontrol nama file yang dikompilasi, yang harus diletakkan tepat sebelum deklarasi nama paket).
companion object{// TODO: Rename and change types and number of parameters@JvmStatic
fun newInstance(param1:String, param2:String)=EditProfileFragment().apply {
arguments =Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)}}}
Biarkan, Anda memiliki Siswa kelas . Dan Anda memiliki satu metode statis getUniversityName () & satu bidang statis yang disebut totalStudent .
Anda harus mendeklarasikan blok objek pendamping di dalam kelas Anda.
companion object{// define static method & field here.}
Kemudian kelas Anda terlihat seperti
classStudent(var name:String,var city:String,var rollNumber:Double=0.0){// use companion object structure
companion object{// below method will work as static method
fun getUniversityName():String="MBSTU"// below field will work as static fieldvar totalStudent =30}}
Kemudian Anda dapat menggunakan metode dan bidang statis seperti ini.
println("University : "+Student.getUniversityName()+", Total Student: "+Student.totalStudent)// Output:// University : MBSTU, Total Student: 30
Tidak ada kata kunci statis di kotlin. kotlin docs merekomendasikan untuk menggunakan fungsi tingkat paket jika Anda ingin mengikuti KERING. Buat file dengan ekstensi .kt dan masukkan metode Anda di dalamnya.
package p
fun m(){//fun body}
setelah dikompilasi m akan memiliki tanda tangan public static final void
Anda dapat mencapai fungsionalitas statis di Kotlin oleh Object Companion
Menambahkan pendamping ke deklarasi objek memungkinkan untuk menambahkan
fungsionalitas statis ke objek meskipun konsep statis sebenarnya tidak ada di Kotlin.
Sebuah objek pendamping dapat mengakses semua anggota kelas juga, termasuk konstruktor swasta.
Sebuah objek pendamping diinisialisasi ketika kelas dipakai.
Sebuah objek pendamping tidak dapat dideklarasikan di luar kelas.
classMyClass{
companion object{
val staticField ="This is an example of static field Object Decleration"
fun getStaticFunction():String{return"This is example of static function for Object Decleration"}}}
Anggota objek pendamping dapat dipanggil dengan hanya menggunakan nama kelas sebagai kualifikasi:
Keluaran:
MyClass.staticField // This is an example of static field Object DeclerationMyClass.getStaticFunction():// This is an example of static function for Object Decleration
Banyak orang menyebutkan benda pendamping, yang benar. Tapi, supaya Anda tahu, Anda juga dapat menggunakan segala jenis objek (menggunakan kata kunci objek, bukan kelas) yaitu,
objectStringUtils{
fun toUpper(s:String):String{...}}
Gunakan seperti metode statis apa pun di java:
StringUtils.toUpper("foobar")
Pola semacam itu agak tidak berguna di Kotlin, salah satu kelebihannya adalah ia menghilangkan kebutuhan akan kelas yang dipenuhi dengan metode statis. Lebih tepat menggunakan fungsi global, ekstensi, dan / atau sebagai gantinya, tergantung pada use case Anda. Di tempat saya bekerja, kita sering mendefinisikan fungsi ekstensi global dalam file flat dan terpisah dengan konvensi penamaan: [className] Extensions.kt yaitu, FooExtensions.kt. Tetapi lebih khusus kita menulis fungsi di mana mereka dibutuhkan di dalam kelas atau objek operasi mereka.
Jika Anda membutuhkan fungsi atau properti untuk diikat ke kelas daripada ke instance, Anda bisa mendeklarasikannya di dalam objek pendamping:
classCar(val horsepowers:Int){
companion objectFactory{
val cars = mutableListOf<Car>()
fun makeCar(horsepowers:Int):Car{
val car =Car(horsepowers)
cars.add(car)return car
}}}
Objek pendamping adalah singleton, dan anggotanya dapat diakses langsung melalui nama kelas yang mengandung
val car =Car.makeCar(150)
println(Car.Factory.cars.size)
Sepertinya jawaban yang diterima sudah menggambarkan objek pendamping. Begitu juga banyak jawaban lain. Apakah jawaban Anda memberikan sesuatu yang baru?
Jawaban:
Anda menempatkan fungsi di "objek pengiring".
Jadi kode java seperti ini:
akan menjadi
Anda kemudian dapat menggunakannya dari dalam kode Kotlin sebagai
Tetapi dari dalam kode Java, Anda harus menyebutnya sebagai
(Yang juga bekerja dari dalam Kotlin.)
Jika Anda tidak suka harus menentukan
Companion
bit, Anda bisa menambahkan@JvmStatic
anotasi atau memberi nama kelas rekan Anda.Dari dokumen :
Menambahkan
@JvmStatic
anotasi terlihat seperti inidan kemudian akan ada sebagai fungsi statis Java nyata, dapat diakses dari Java dan Kotlin sebagai
Foo.a()
.Jika itu hanya tidak disukai untuk
Companion
nama, maka Anda juga dapat memberikan nama eksplisit untuk objek pendamping terlihat seperti ini:yang akan membiarkan Anda memanggilnya dari Kotlin dengan cara yang sama, tetapi dari java like
Foo.Blah.a()
(yang juga akan bekerja di Kotlin).sumber
fun a(): Int { return 1 }
atau bahkanfun a(): Int = 1
fun a() = 1
.Factory
adalah nama objek pendamping - tapi untuk apa itu bisa digunakan? Saya tidak tahu, tapi saya tertarik jadi saya membuat pertanyaan yang didedikasikan untuk itu: stackoverflow.com/q/45853459/221955 .Docs merekomendasikan untuk menyelesaikan sebagian besar kebutuhan untuk fungsi statis dengan fungsi tingkat paket . Mereka hanya dideklarasikan di luar kelas dalam file kode sumber. Paket file dapat ditentukan di awal file dengan kata kunci paket.
Pernyataan
Pemakaian
kalau tidak
Anda sekarang dapat memanggil fungsi dengan:
atau jika Anda tidak menggunakan kata kunci impor:
Jika Anda tidak menentukan paketnya, fungsinya akan dapat diakses dari root.
Jika Anda hanya memiliki pengalaman dengan java, ini mungkin tampak sedikit aneh. Alasannya adalah bahwa kotlin bukan bahasa berorientasi objek yang ketat. Bisa dibilang ini mendukung metode di luar kelas.
Sunting: Mereka telah mengedit dokumentasi untuk tidak lagi menyertakan kalimat tentang merekomendasikan fungsi tingkat paket. Ini asli yang disebut di atas.
sumber
class FooPackage
dengan semua properti dan fungsi tingkat atas, dan merutekan semua referensi Anda ke mereka dengan tepat. Info lebih lanjut dari jetbrains.bar()
tidak masalah nama file, Anda dapat menamainyaBarUtils.kt
atau apa pun, maka seperti yang dikatakan teks Anda akan mengimpornya denganimport <package name>.bar
A. Cara Jawa Kuno:
Nyatakan a
companion object
untuk menyertakan metode / variabel statisGunakan:
B. Cara Kotlin baru
Deklarasikan langsung pada file tanpa kelas pada
.kt
file.Gunakan
methods/variables
dengan nama mereka . ( Setelah mengimpor mereka )Gunakan:
sumber
INSTANCE
kata kunci, seperti ini:Foo.INSTANCE.sayFoo()
static CLASS
tidak adilstatic methdos
. Karena dengan objek pendamping Anda masih dapat membuat instance kelas induk.val
tidak statis sama denganstatic final
di JawaGunakan objek untuk mewakili val / var / metode untuk membuat statis. Anda dapat menggunakan objek bukan kelas tunggal juga. Anda dapat menggunakan pendamping jika Anda ingin membuat statis di dalam kelas
Jika Anda perlu memanggilnya dari Jawa:
Di Kotlin, abaikan INSTAN.
sumber
Ini juga bekerja untuk saya
dari Kotlin
dari Jawa
sumber
sumber
Anda harus melewati objek pengiring untuk metode statis karena kotlin tidak memiliki kata kunci statis - Anggota objek pengiring dapat dipanggil dengan hanya menggunakan nama kelas sebagai kualifikasi:
sumber
Ada 2 cara Anda dapat menerapkan statis di Kotlin
Pertama buat objek pendamping di bawah kelas
Misalnya:
Anda dapat memanggil fungsi ini sebagai
Cara lain yang bisa kita gunakan adalah membuat kelas objek
Selamat Coding!
sumber
Test.Companion.isCheck(2)
) IDE menampilkan peringatan dan ucapkanCompanion reference is redundant
. Itu bisa dikurangi menjadiTest.isCheck(2)
dan bentuk dikurangi lebih dekat dengan setara java.Kotlin tidak memiliki kata kunci statis. Anda menggunakannya untuk java
dan Untuk Kotlin
Panggilan untuk Jawa
Panggil Kotlin
Saya pikir ini bekerja dengan sempurna.
sumber
Saya ingin menambahkan sesuatu ke jawaban di atas.
Ya, Anda dapat mendefinisikan fungsi dalam file kode sumber (di luar kelas). Tetapi lebih baik jika Anda mendefinisikan fungsi statis di dalam kelas menggunakan Objek Pengiring karena Anda dapat menambahkan lebih banyak fungsi statis dengan memanfaatkan Ekstensi Kotlin .
Dan Anda dapat memanggil fungsi yang didefinisikan di atas karena Anda akan memanggil fungsi apa pun di dalam Objek Pengiring.
sumber
Meskipun ini sedikit lebih dari 2 tahun sekarang, dan punya banyak jawaban bagus, saya melihat beberapa cara lain untuk mendapatkan bidang "statis" Kotlin hilang. Berikut adalah contoh panduan untuk
static
interop Kotlin-Java :Jawaban Michael Anderson memberikan kedalaman lebih dari ini, dan pasti harus dijadikan referensi untuk skenario ini.
Skenario berikut ini menangani pembuatan bidang statis di Kotlin sehingga Java tidak harus terus memanggil
KotlinClass.foo()
kasus-kasus di mana Anda tidak ingin fungsi statis.Salah satu fitur hebat tentang Kotlin adalah Anda dapat membuat fungsi dan variabel tingkat atas. Ini membuatnya greate untuk membuat daftar "classless" dari bidang dan fungsi konstan, yang pada gilirannya dapat digunakan sebagai
static
fungsi / bidang di Jawa.Disebutkan lain yang dapat digunakan di Jawa sebagai bidang "statis" adalah
object
kelas Kotlin . Ini adalah nol parameter kelas tunggal yang dipakai malas saat digunakan pertama kali. Informasi lebih lanjut tentang mereka dapat ditemukan di sini: https://kotlinlang.org/docs/reference/object-declarations.html#object-declarationsNamun, untuk mengakses singleton, sebuah
INSTANCE
objek khusus dibuat, yang sama rumitnya untuk ditangani sebagaimanaCompanion
adanya. Berikut cara menggunakan anotasi untuk memberikan kesan bersihstatic
di Jawa:sumber
Untuk membuatnya singkat, Anda bisa menggunakan "objek pengiring" untuk masuk ke dunia statis Kotlin seperti:
dan untuk membuat bidang konstan gunakan "const val" seperti dalam kode. tetapi cobalah untuk menghindari kelas statis karena membuat kesulitan dalam pengujian unit menggunakan Mockito !.
sumber
Konversi yang tepat dari metode java statis untuk setara kotlin akan seperti ini. mis. Di sini kelas util memiliki satu metode statis yang akan setara di kedua java dan kotlin. Penggunaan @JvmStatic penting.
Kode Java:
Kode Kotlin:
sumber
Cukup Anda perlu membuat objek pendamping dan memasukkan fungsi di dalamnya
Untuk memanggil metode dari kelas kotlin:
atau Menggunakan impor
Untuk memanggil metode dari kelas java:
atau dengan menambahkan penjelasan @JvmStatic ke metode
atau keduanya dengan menambahkan penjelasan @JvmStatic ke metode dan membuat impor statis di java
sumber
Untuk Jawa:
Kode Kotlin Setara:
Jadi untuk ekivalen dari metode statis Java adalah kelas objek di Kotlin.
sumber
Untuk Android menggunakan string dari satu aktivitas ke semua aktivitas yang diperlukan. Sama seperti statis di java
public final static String TEA_NAME = "TEA_NAME";
Pendekatan Setara di Kotlin:
Aktivitas lain di mana nilai dibutuhkan:
sumber
kecuali jawaban Michael Anderson, saya memiliki kode dengan dua cara lain dalam proyek saya.
Pertama:
Anda dapat memutihkan semua variabel menjadi satu kelas. membuat file kotlin bernama Const
Anda dapat menggunakannya dalam kode kotlin dan java
Kedua:
Anda dapat menggunakan fungsi ekstensi Kotlin
membuat file kotlin bernama Ext, kode di bawah ini adalah semua kode dalam file Ext
Anda dapat menggunakannya dalam kode kotlin
Anda dapat menggunakannya dalam kode java
sumber
Tuliskan langsung ke file.
Di Jawa (jelek):
Di Kotlin:
Kedua potongan kode tersebut sama dengan setelah kompilasi (bahkan nama file yang dikompilasi,
file:JvmName
digunakan untuk mengontrol nama file yang dikompilasi, yang harus diletakkan tepat sebelum deklarasi nama paket).sumber
Gunakan
@JVMStatic
Anotasisumber
Biarkan, Anda memiliki Siswa kelas . Dan Anda memiliki satu metode statis getUniversityName () & satu bidang statis yang disebut totalStudent .
Anda harus mendeklarasikan blok objek pendamping di dalam kelas Anda.
Kemudian kelas Anda terlihat seperti
Kemudian Anda dapat menggunakan metode dan bidang statis seperti ini.
sumber
Tidak ada kata kunci statis di kotlin. kotlin docs merekomendasikan untuk menggunakan fungsi tingkat paket jika Anda ingin mengikuti KERING. Buat file dengan ekstensi .kt dan masukkan metode Anda di dalamnya.
setelah dikompilasi m akan memiliki tanda tangan public static final void
dan
☺
sumber
Anda dapat mencapai fungsionalitas statis di Kotlin oleh Object Companion
Sebuah objek pendamping tidak dapat dideklarasikan di luar kelas.
Anggota objek pendamping dapat dipanggil dengan hanya menggunakan nama kelas sebagai kualifikasi:
Keluaran:
sumber
Semua anggota dan fungsi statis harus berada di dalam blok pengiring
sumber
Banyak orang menyebutkan benda pendamping, yang benar. Tapi, supaya Anda tahu, Anda juga dapat menggunakan segala jenis objek (menggunakan kata kunci objek, bukan kelas) yaitu,
Gunakan seperti metode statis apa pun di java:
Pola semacam itu agak tidak berguna di Kotlin, salah satu kelebihannya adalah ia menghilangkan kebutuhan akan kelas yang dipenuhi dengan metode statis. Lebih tepat menggunakan fungsi global, ekstensi, dan / atau sebagai gantinya, tergantung pada use case Anda. Di tempat saya bekerja, kita sering mendefinisikan fungsi ekstensi global dalam file flat dan terpisah dengan konvensi penamaan: [className] Extensions.kt yaitu, FooExtensions.kt. Tetapi lebih khusus kita menulis fungsi di mana mereka dibutuhkan di dalam kelas atau objek operasi mereka.
sumber
Di Jawa, kita bisa menulis dengan cara di bawah ini
Di Kotlin, kita bisa menulis dengan cara di bawah ini
seorang teman digunakan sebagai statis di Kotlin.
sumber
Penyedia dokumen kotlin tiga cara untuk melakukan itu, yang pertama adalah mendefinisikan fungsi dalam paket, tanpa kelas:
yang kedua adalah menggunakan penjelasan @JvmStatic:
dan yang ketiga adalah menggunakan objek pendamping:
sumber
Jika Anda membutuhkan fungsi atau properti untuk diikat ke kelas daripada ke instance, Anda bisa mendeklarasikannya di dalam objek pendamping:
Objek pendamping adalah singleton, dan anggotanya dapat diakses langsung melalui nama kelas yang mengandung
sumber
Kamu bisa menggunakan Objek Pendamping - kotlinlang
Yang dapat ditunjukkan dengan terlebih dahulu membuat Antarmuka itu
Maka kita harus membuat fungsi di dalam antarmuka itu:
Kemudian setelah itu, Kami membutuhkan kelas:
di dalam kelas itu kita membutuhkan Object pendamping di dalam kelas itu:
di dalam Object Companion itu kita membutuhkan
SomeFunc
fungsi lama itu , Tapi kita harus naik itu:Akhirnya di bawah semua pekerjaan itu, Kami membutuhkan sesuatu untuk mendukung fungsi statis itu, Kami membutuhkan variabel:
sumber