Mengapa tidak ada kata kunci statis di Kotlin?

29

Kotlin dikenal terutama sebagai pengganti drop-in untuk Java, tetapi menghilangkan konstruksi Java yang terkenal: statickata 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.

pengguna1446
sumber
4
Hanya menyaksikan sebagai seseorang yang memprogram dalam scala: objek pengiring memisahkan kode untuk metode statis dan non statis, mereka dapat memperluas kelas atau antarmuka lain dalam konteks statis, dan Anda dapat mereferensikan objek pengiring dalam suatu variabel. tidak yakin bagaimana peta itu ke kotlin
Phoenix
Apakah metode statis dan yang lainnya memiliki keunggulan signifikan dibandingkan objek pendamping?
Tanner Swett
Ini bukan alasannya, lebih merupakan pengamatan, tetapi saya telah melihat bahwa begitu pemrogram pemula (absolut) menemukan statickata kunci di Jawa, itu segera menyebar ke seluruh penjuru program karena mereka belum diajarkan pemrograman berorientasi objek .
Score_Under

Jawaban:

30

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.

JimmyJames
sumber
2
Itu poin yang bagus. Dan saya selalu berpikir itu aneh bahwa ada lajang dan statika yang memiliki perilaku yang sangat mirip, tetapi dengan apa-apa selain objek pendamping, itu menghilangkan keanehan konseptual itu.
user1446
1
Dan inilah tepatnya mengapa di Jawa saya lebih suka mendefinisikan metode pada objek stateless yang dibangun secara statis daripada mendefinisikan metode statis.
candied_orange
13

Mengutip dari dokumen referensi Kotlin :

Perhatikan bahwa, 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.

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.

Doc Brown
sumber
6

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 Classkelas (dan ya, itu berarti Classturunan 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).

Jörg W Mittag
sumber
1
"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?": Poin bagus, meskipun tidak semua bahasa / perancang bahasa membidik minimalisme. Beberapa melihatnya sebagai keuntungan untuk memiliki konstruksi ad-hoc untuk kasus atau idiom khusus.
Giorgio
1
Saya pikir itu setidaknya dikatakan bahwa Jawa tidak (agak) menerapkan pola itu. Misalnya, jika Anda memiliki MyStaticClassdengan beberapa staticanggota, Anda dapat referensi MyStaticClass.classuntuk mendapatkan Classcontoh untuk kelas itu. Anda kemudian dapat menggunakan refleksi untuk mengakses / meminta staticanggota Anda . Itu masih benar bahwa staticanggota 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.
aroth