Kotlin dikenal terutama sebagai pengganti drop-in untuk Java, tetapi menghilangkan konstruksi Java yang terkenal: static
kata kunci. Sebagai gantinya, fungsionalitas tingkat kelas itu ditawarkan terutama oleh objek pendamping.
Apa yang salah dengan metode dan bidang statis yang objek pendamping menyediakan alternatif yang lebih baik? Saya bingung tentang alasannya, dan tidak dapat menemukan penjelasan dalam dokumentasi.
language-design
pengguna1446
sumber
sumber
static
kata kunci di Jawa, itu segera menyebar ke seluruh penjuru program karena mereka belum diajarkan pemrograman berorientasi objek .Jawaban:
Scala juga menggantikan deklarasi tingkat kelas dengan objek 'Singleton'. Keuntungan utama dari ini adalah bahwa semuanya adalah objek. Di Jawa, anggota statis diperlakukan sangat berbeda dari anggota objek. Ini berarti bahwa Anda tidak dapat melakukan hal-hal seperti mengimplementasikan antarmuka atau menempatkan 'instance' kelas Anda di peta atau meneruskannya sebagai parameter ke metode yang mengambil Object. Objek pendamping memungkinkan untuk hal-hal ini. Itulah keuntungannya.
sumber
Mengutip dari dokumen referensi Kotlin :
Bagi saya, sepertinya para desainer Kotlin menganggap ini sebagai keuntungan dibandingkan dengan anggota statis Java.
Selain itu, bagian tentang interoperabilitas Java dan anggota statis menjelaskan bagaimana objek pengiring dapat digunakan untuk membuat anggota yang berperilaku efektif seperti anggota statis ketika dijelaskan
@JvmStatic
.sumber
Kotlin adalah bahasa berorientasi objek. Dalam bahasa berorientasi objek, sesuatu yang tidak menjadi objek adalah batasan yang sangat melumpuhkan. Kelas bukan objek, tapi objek adalah objek (ya!), Jadi pertanyaannya seharusnya: mengapa bahasa tidak menggunakan objek pengiring?
Aspek lain adalah kesederhanaan: mengapa memiliki dua hal, objek dengan anggota contoh dan kelas dengan anggota statis ketika Anda hanya dapat memiliki objek dengan anggota contoh?
Alternatif yang digunakan dalam banyak bahasa yang diturunkan dari Smalltalk, adalah membuat kelas itu sendiri objek. Misalnya dalam kelas Smalltalk adalah contoh hirarki paralel dari metaclasses . Di Ruby, kelas adalah instance dari
Class
kelas (dan ya, itu berartiClass
turunan dari dirinya sendiri). Dalam hal itu, "metode kelas" sebenarnya hanya metode instance normal dari kelas metaclass. Saya tidak tahu mengapa desain ini tidak dipilih di Jawa (mengingat kaitannya dengan Smalltalk), tetapi mungkin ada hubungannya dengan menyederhanakan sistem tipe (perhatikan bahwa sebagian besar bahasa dengan objek kelas-sebagai-objek cenderung menjadi bahasa dinamis).sumber
MyStaticClass
dengan beberapastatic
anggota, Anda dapat referensiMyStaticClass.class
untuk mendapatkanClass
contoh untuk kelas itu. Anda kemudian dapat menggunakan refleksi untuk mengakses / memintastatic
anggota Anda . Itu masih benar bahwastatic
anggota tidak benar-benar melekat pada contoh objek apa pun (setidaknya secara konseptual; tidak yakin apa yang sebenarnya Java lakukan di bawah selimut). Tetapi itu berarti bahwa setidaknya beberapa batasan yang diangkat dalam jawaban yang diterima tidak sepenuhnya berlaku.