Apa keuntungan dari objek pendamping Scala vs metode statis?

50

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?

Zavior
sumber

Jawaban:

49

Berikut adalah beberapa alasan, yang mungkin lebih atau kurang menarik bagi Anda, tergantung pada preferensi Anda sendiri:

  1. 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.

  2. Lajang - setiap Scala objectsecara 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. Menulis objectalih-alih classmenjadikannya singleton dan Anda sudah selesai.

  3. Akses ke metode statis: Metode statis di Jawa dapat diakses dari objek. Misalnya, Anda memiliki kelas Cdengan metode statis fdan objek ctipe C. Maka Anda harus memanggil C.f, tetapi Java memungkinkan Anda (meskipun dengan peringatan) untuk digunakan c.f, yang ketika Anda berasal dari latar belakang Scala tidak benar-benar masuk akal, karena objek tidak memiliki metode yang fbenar-benar.

  4. 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.

  5. 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.

jujur
sumber
1
Saya juga membaca, bahwa statika tidak termasuk dalam perangkat lunak OOP murni. Seperti, ketika Anda membutuhkan perilaku statis, gunakan kelas sendiri dan buat satu (singleton) objek itu, yang mengelola (berpotensi) perilaku statis objek dari kelas lain.
K ..
1
"Menulis objek, bukan kelas, menjadikannya singleton dan kamu selesai." Saya sendiri tidak terlalu peduli dengan Lajang, tetapi saya harus mengakui bahwa keterusterangan "gula sintaksis" ini memiliki daya tarik tertentu.
Ed Hastings
3
Tak satu pun dari poin 1 hingga 5 (dan bahkan semuanya bersamaan) membutuhkan objek pendamping sejati saat runtime untuk diimplementasikan. Semuanya dapat dengan mudah dibuat menjadi gula sintaksis murni, dengan nol dampak runtime. Satu-satunya alasan nyata untuk memiliki objek pendamping runtime diberikan dalam jawaban Alexey Romanov.
mas.morozov
"Kerugiannya jauh lebih sulit ditemukan." Performa? mengakses metode objek menghasilkan ifnonnullbytecode dll, dibandingkan dengan sederhana invokeStatic.
Eduardo Pareja Tobes
33

Satu lagi manfaat adalah objects dapat mengimplementasikan antarmuka / sifat, tidak seperti metode statis.

Alexey Romanov
sumber
8
Saya rasa ini adalah yang perbedaan utama antara objek pendamping vs kelas dengan metode statis. Objek pendamping bersifat polimorfik dan dapat diedarkan sebagai argumen untuk metode yang mengharapkan antarmuka / sifat.
dcastro
4

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.

Gene T
sumber