Apakah ada kasus di mana objek pendamping (tunggal) untuk kelas diperlukan? Mengapa saya ingin membuat kelas, misalnya, Foo
dan juga membuat objek pendamping untuknya?
oop
scala
companion-object
Rahul
sumber
sumber
Jawaban:
Objek pendamping pada dasarnya menyediakan tempat di mana seseorang dapat meletakkan metode "seperti statis". Selanjutnya, objek pendamping, atau modul pendamping, memiliki akses penuh ke anggota kelas, termasuk yang pribadi.
Objek pendamping sangat bagus untuk merangkum hal-hal seperti metode pabrik. Daripada harus memiliki, misalnya,
Foo
dan diFooFactory
mana saja, Anda dapat meminta kelas dengan objek pendamping untuk mengambil tanggung jawab pabrik.sumber
Objek pendamping berguna untuk menyimpan status dan metode yang umum untuk semua instance kelas, tetapi tidak menggunakan metode atau kolom statis . Mereka menggunakan metode virtual biasa yang dapat diganti melalui pewarisan. Scala benar-benar tidak statis. Ada banyak cara untuk menggunakan ini, tetapi berikut adalah contoh sederhananya.
Yang menghasilkan keluaran ini:
sumber
... dan ini adalah tempat yang baik untuk menyimpan metode pabrik statis (bukan DP) untuk kelas yang menyertai. Jika Anda menamai metode pabrik yang kelebihan beban tersebut berlaku (/ ... /) Anda akan dapat membuat / menginisialisasi kelas Anda
tanpa 'baru' (tidak terlalu penting)
dengan kemungkinan set parameter yang berbeda (bandingkan dengan apa yang ditulis Bloch di Java Efektif tentang konstruktor telescoping)
dengan kemampuan untuk memutuskan kelas turunan mana yang ingin Anda buat, bukan yang abstrak (disertai)
Kode contoh:
Saya tidak akan memanggil objek / kelas dasar AbstractXxxxx karena tidak terlihat buruk: seperti membuat sesuatu yang abstrak. Beri nama-nama itu arti yang sebenarnya. Pertimbangkan untuk menggunakan kelas kasus yang tidak dapat diubah, metode kurang, dan segel kelas dasar abstrak.
sumber
RealThing
danAlternativeThing
kelas harus memilikiprivate
konstruktor untuk memaksa pengguna menggunakanAbstractClass
pabrik has.class AlternativeThing private(i: Int) extends AbstractClass
Selain hal-hal yang dikatakan Saem dalam balasannya , pengompilasi Scala juga mencari jenis konversi implisit dalam objek pendamping yang sesuai (baik dari sumber atau target), sehingga konversi tidak perlu diimpor.
Tentang alasan objek tunggal dalam Pemrograman umum di Scala mengatakan:
sumber
Saya selalu melihat objek pendamping sebagai jembatan untuk menulis kode fungsional dan berorientasi objek di Scala. Seringkali kita hanya membutuhkan fungsi murni yang mengambil beberapa masukan dan memberikan hasil pemrosesan. Menempatkan fungsi-fungsi yang relevan di objek pendamping membuatnya mudah untuk dicari dan digunakan, untuk saya sendiri dan juga seseorang yang membangun di atas kode saya.
Selain itu, ini adalah fitur yang disediakan bahasa untuk menulis pola tunggal tanpa melakukan apa pun. Ini sangat berguna ketika Anda membutuhkan singleton untuk merangkum delegator untuk masa pakai JVM. Misalnya, menulis pustaka klien HTTP sederhana di Scala tempat Anda dapat merangkum delegator berbasis implementasi Java yang mendasari dan membiarkan konsumen API Anda hidup di dunia murni.
sumber
Jika Anda mendefinisikan kelas dan objek dalam file yang sama dengan nama yang sama, mereka dikenal sebagai kelas dan objek pendamping. Scala tidak memiliki statis sebagai kata kunci JAVA, Anda dapat mengambil statis sebagai pengganti kelas dan objek pendamping di Scala.
Untuk informasi lebih detail silakan cek kelas artikel dan kata kunci objek dalam pemrograman scala
sumber
Pada awalnya, ini memberikan pemisahan yang jelas antara metode metode statis vs non statis, juga menyediakan cara sederhana untuk membuat kelas tunggal.
Ia juga dapat mewarisi metode dari kelas dan / atau sifat lain, yang tidak dapat dilakukan dengan metode statis Java. Dan dapat dikirimkan sebagai parameter.
sumber