Scala tidak memiliki kata kunci- statis , tetapi sebaliknya memiliki fungsi serupa melalui objek pendamping. Di belakang layar objek pendamping dikompilasi ke kelas yang memiliki metode statis, jadi semua ini adalah gula sintaksis. Apa kelebihan dari pilihan desain ini? Kerugian? Apakah bahasa lain memiliki konstruksi yang sama?
50
Jawaban:
Berikut adalah beberapa alasan, yang mungkin lebih atau kurang menarik bagi Anda, tergantung pada preferensi Anda sendiri:
Jangan hanya mengabaikannya karena menjadi "gula sintaksis". Meskipun Anda mungkin mengatakan bahwa sesuatu itu hanya gula sintaksis, bagaimanapun juga gulalah yang mempermanis hidup Anda - sebagai seorang programmer seperti halnya seorang peminum kopi atau teh.
Lajang - setiap Scala
object
secara inheren adalah lajang. Menimbang bahwa di dunia Jawa orang menerapkan lajang dalam segala cara yang berbeda dan lebih sering berakhir dengan membuat kesalahan dalam penerapannya, Anda tidak dapat membuat kesalahan sesederhana itu di Scala. Menulisobject
alih-alihclass
menjadikannya singleton dan Anda sudah selesai.Akses ke metode statis: Metode statis di Jawa dapat diakses dari objek. Misalnya, Anda memiliki kelas
C
dengan metode statisf
dan objekc
tipeC
. Maka Anda harus memanggilC.f
, tetapi Java memungkinkan Anda (meskipun dengan peringatan) untuk digunakanc.f
, yang ketika Anda berasal dari latar belakang Scala tidak benar-benar masuk akal, karena objek tidak memiliki metode yangf
benar-benar.Hapus pemisahan: Di Jawa Anda dapat mencampur atribut dan metode statis dan non-statis dalam sebuah kelas. Jika Anda bekerja dengan disiplin, ini tidak menjadi masalah, namun, jika Anda (atau orang lain dalam hal ini) tidak, maka Anda berakhir dengan bagian statis dan non-statis yang disatukan dan sulit untuk mengetahui dengan cepat apa yang statis dan apa yang tidak. Di Scala, segala sesuatu yang terletak di dalam objek pendamping jelas bukan bagian dari objek runtime kelas terkait, tetapi tersedia dari konteks statis. Begitu juga sebaliknya, jika ditulis di dalam kelas, itu tersedia untuk instance dari kelas itu, tetapi tidak dari konteks statis. Ini menjadi sangat memberatkan di Jawa, setelah Anda mulai menambahkan blok penginisialisasi statis dan non-statis ke kelas Anda. Ini bisa menjadi sangat sulit untuk dipahami dalam hal urutan eksekusi dinamis.
Lebih sedikit kode: Anda tidak perlu menambahkan kata statis ke setiap dan setiap atribut atau metode dalam
object
, sehingga menjaga kode lebih ringkas (memang, bukan keunggulan yang menonjol).Kerugiannya jauh lebih sulit ditemukan. Orang mungkin berpendapat, bahwa bagian statis dan non-statis harus dimiliki bersama, tetapi dipisahkan oleh konsep Scala objek pendamping. Sebagai contoh, mungkin tampak aneh memiliki diagram kelas, tetapi kemudian harus membuat dua hal dalam kode dan membedah atribut mana yang berjalan.
sumber
ifnonnull
bytecode dll, dibandingkan dengan sederhanainvokeStatic
.Satu lagi manfaat adalah
object
s dapat mengimplementasikan antarmuka / sifat, tidak seperti metode statis.sumber
Objek pendamping adalah tempat pertama yang mencari implisit, setelah itu, scala melihat Predef dan kemudian secara eksplisit "mengimpor" pernyataan dalam file sumber tertentu.
Saya tidak cukup seorang pengembang java untuk mengetahui apakah bahasa java atau perpustakaan menyediakan mekanisme yang sebanding.
sumber